FMS做成的客户端动画同步(网游基础)

前一段时间用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就可以连接了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值