×

用XMLSocket实现多人连网对战的即时战略游戏(二)

Kalet Kalet 发表于2010-06-19 16:09:14 浏览202 评论0

抢沙发发表评论

 上次已经讲过,flash中提供的XMLSocket对象能实现实时联机的功能。XMLSocket对象只有3中方法和4中事件:

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端的功能。

(待续)

编辑:闪客帝国

群贤毕至

访客