前一段时间用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 弃天笑 sujun10@21cn.com
* @version 1.0
* <br>Copyright 2005-2007 The SDK-I Studio
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:2007.3.20
*/
class soda.Person extends MovieClip
{
private var speed:Number = 5;
private var nameText:TextField;
public function Person()
{
//初始位置
this._x = 100;
this._y = 100;
}
public function setName(name:String)
{
nameText.text = name;
}
//控制主角的动作
public function right():Void
{
this._x += speed;
}
public function left():Void
{
this._x -= speed;
}
public function up():Void
{
this._y -= speed;
}
public function down():Void
{
this._y += speed;
}
}
恩,如果有什么
问题,大家再讨论吧,下面是flash8环境,我调试过的。如果.swf不行的话,把.swf打包成.exe就可以连接了