前一段时间用java跟flash写了个最基本的客户端同步程序,现在再发用fms写了,大体上思路是不变的,但是因为服务器的程序不一样,所以多少有点变动。程序在这里就不作详细讲解,我在程序里写了详细的说明,大家可以下载去看。这里只讲下重要的部分
至于程序用到的map。hashmap类,大家可以看我写那些类,这里也不说了。本来我把所有的程序都封装成了,但是考虑到简单易用,所以把打部分代码写进了时间线上。过一阵再把这些代码封进类吧,看起来会高级一点,呵呵
stop(); import mx.soda.util.Map; import mx.soda.util.HashMap; //用户名 var userName:String; //玩家 var personMC:MovieClip; //所有玩家mc的深度 var depth:Number = 100; var mync:NetConnection = new NetConnection(); //其他用户的集合 var userSet:Map = new HashMap(); //连接到服务器,并传送当前用户名 mync.connect("rtmp://localhost/game",userName); //建立当前登陆玩家 personMC = this.attachMovie("personMC","personMC" + userName,depth++); //设置用户名 personMC.setName(userName); //连接状态 mync.onStatus = function(info) { if (info.code == "NetConnection.Connect.Success") { trace("接通"); } }; //键盘动作,控制人物移动,并把当前动作发送到服务器 this.onEnterFrame = function () { if( Key.isDown( Key.UP ) ) { personMC.up(); mync.call("userAction",null,userName,"up"); } else if( Key.isDown( Key.DOWN ) ) { personMC.down(); mync.call("userAction",null,userName,"down"); } else if( Key.isDown( Key.LEFT ) ) { personMC.left(); mync.call("userAction",null,userName,"left"); } else if( Key.isDown ( Key.RIGHT ) ) { personMC.right(); mync.call("userAction",null,userName,"right"); } }
//当有新用户登陆时,被服务器呼叫 mync.userLogin = function(name:String) { //根据名字复制一个新的mc,最近登陆的用户 var mc:MovieClip = _root.attachMovie("personMC","personMC" + name,depth++); userSet.put(name,mc); mc.setName(name); //马上呼叫客户端,把自己的位置告诉新登陆的客户端 mync.call("userInfo",null,userName,name,personMC._x,personMC._y); }; //当其他用户有动作时,被服务器呼叫 mync.userAction = function(name:String,action:String) { var mc:MovieClip = userSet.get(name); //执行对应的方法 mc[action](); }; //更新已经登陆的用户 mync.createUser = function(userName,x,y) { //根据名字复制一个新的mc var mc:MovieClip = _root.attachMovie("personMC","personMC" + userName,depth++); userSet.put(userName,mc); mc.setName(userName); mc._x = x; mc._y = y; }
这些代码很容易懂吧,接下来是服务端的代码
var userSet = new Object(); //当用户登陆时,响应该事件 application.onConnect = function(client,userName) { application.acceptConnection(client); //把当前登陆的用户名进行广播 for(var str in userSet) { userSet[str].call("userLogin",null,userName); } //添加当前用户名 userSet[userName] = client; } //对客户端传过来的信息进行转发 Client.prototype.userAction = function(userName,action) { for(var str in userSet) { //避免把信息发给当前用户
if(userName != str) { userSet[str].call("userAction",null,userName,action); } } } //呼叫最新用户更新其他用户资料 Client.prototype.userInfo = function(selfName,userName,x,y) { userSet[userName].call("createUser",null,selfName,x,y); }
最后补上控制mc的代码,是与一个mc捆绑在一起的
/* * $Id:Person.as $ * * @author 弃天笑 |