1.XMLSocket的方法:
①.联机:connect(服务器地址,端口号)
示例:mySocket.connect("127.0.0.1",1024);②.传送信息:send(信息内容)
示例:mySocket.send("<位置 name="ship3" x="20" y="60">");③.关闭和远程计算机之间的联结:close()
示例:mySocket.close();2.XMLSocket的事件:
①.onConnect(联机结果)
当connect()联机方法执行完毕后,它会触发并且传入一个代表联机是否成功的参数给onConnect()事件,如果联机成功,其值将是true。②.onXML()
当XMLSocket接收到远程计算机传入的xml资料时,就会触发onXML()事件。③.onData()
当XMLSocket接收到远程计算机传入的资料时,就会出发onData()事件。它和onXML()事件的不同之处在于从onData()事件取得的资料是尚未经过flash解析的原始字符串,而从onXML()事件取得的是经过解析后的XML资料。因为不同XMLSocket对象之间的往来信息都是XML格式,因此onXML()事件比较常用。④.onClose()
当联机中断时,这个事件会被触发。
flash中的设计
在这个游戏中,flash从server端接收到的信息有3种:
①第一种是联线成功后,从server端返回一个编号,可以保证每个联机的用户都拥有不同的id,比如:如果我们接收到的编号是3的话,我们就将我们发送个server端的信息中的name属性设为ship3。
②第二种是从server端接收到的其它飞船的位置信息,这将是我们在整个游戏的过程中接收到的主要信息。
③第三种是如果联线人数已满,返回的错误信息。
而flash传给server端的信息只有一种,那就是自己的位置信息,服务器端要做的事情就是接收这个位置信息后,马上转发给其他联机者。
总的说来,flash中的流程如下:
1.向服务器端发送联线请求
2.如果联线成功,等待从服务器返回的信息,如果为“<id>3</id>”之类,则跳到游戏场景那一帧,如果返回的信息为“<err>full</err>”,说明联机的人数已满,跳到第三帧,告知游戏者游戏人数已满。
3.在游戏中,不断将自己的位置信息以“<位置 name='ship3' x='20' y='60' rotate='40'/>”这样的格式发送到服务器,并从服务器端接受其他船的位置信息,并在场景中用attachMovie复制出一个船,并调整其位置和角度。
flash中的实现
1.将上次讲的游戏代码的所有内容从第一帧移到第二帧,因为我们要在第一帧完成联机和一些其他的初始化工作,添加第三帧,用来显示联机人满的消息。
2.第一帧的代码:
//声明XMLSocket对象 var mySocket=new XMLSocket(); //连接服务器 mySocket.connect("127.0.0.1",1024); mySocket.onConnect=function(sucess){ if(success){ trace("连接成功"); }else{ trace("连接失败"); } } mySocket.onXML=function(xmlDoc){ //如果返回的是编号信息 if(xmlDoc.firstChild.nodeName="id"){ gotoAndStop(2); _root.myName="ship"+xmlDoc.firstChild.firstChild.nodeValue; mySocket.onXML=playGame; } //如果返回的是人满的信息 if(xmlDoc.firstChild.nodeName="err"){ gotoAndStop(3); mySocket.close(); } } //定义函数playGame(); function playGame(xmlDox){ _root.ortherName=xmlDoc.firstChild.attributes.name; _root.ortherx=xmlDoc.firstChild.attributes.x; _root.orthery=xmlDoc.firstChild.attributes.y; _root.ortherrotate=xmlDoc.firstChild.attributes.rotate; if(_root.ortherName<>_root.myName){ attachMovie("othership",_root.otherName,1); _root[_root.otherName]._x=_root.ortherx; _root[_root.otherName]._y=_root.orthery; _root[_root.otherName]._rotate=_root.ortherrotate; } }
记住,一定要将库中的ship复制为一个othership,并将其中的代码去掉,并linkage为othership,这是因为其他的飞船我们能看到它和他们位置的改变,但是不能通过鼠标直接控制,所以里面的代码并不需要。
3.第二帧的代码:
//这里主要是实现向服务器发送自己的位置,把它 //放在control这个mc的enterFrame事件里面: on(enterFrame){ //……//以前的代码 var msg="<位置 name='"+_root.myName+"' x='"+_root.ship._x+"' y='"+_root.ship._y+"' rotate='"+_root.ship._rotate+"'/>"; if(mySocket&&mySocket.connected){ mySocket.send(msg); } }
OK,下一次我们来看看怎样在vc++里面实现server端的功能。