白桦的天空

第一次的心动,永远的心痛!
  首页  :: 新随笔  :: 联系 :: 管理
上次已经讲过,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端的功能。