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);
}
}
①.联机: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);
}
}