发新话题
打印

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

本帖已经被作者加入个人空间

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就可以连接了

[ 本帖最后由 弃天笑 于 2007-3-23 10:06 编辑 ]

附件

代码.rar (171.44 KB)

2007-3-22 15:56, 下载次数: 517

源代码

TOP

哈哈,再发一个用类封了的客户端代码
/*
* $Id:GameMain.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
*/

import mx.soda.util.Map;
import mx.soda.util.HashMap;

class soda.GameMain
{
        //用户名
        private var userName:String;
        private var connect:NetConnection;
        //其他用户的集合
        private var userSet:Map;
        //根影片
        private var rootMC:MovieClip;
        //玩家
        private var personMC:MovieClip;
        //玩家mc的深度
        private var depth:Number;
       
        public function GameMain(userName:String,rootMC:MovieClip)
        {
                this.userName = userName;
                this.rootMC = rootMC;
                depth = 100;
                userSet = new HashMap();
                connect = new NetConnection();
                //连接到服务器
                connect.connect("rtmp://localhost/game",userName);
                //建立当前登陆玩家
                personMC = rootMC.attachMovie("personMC","personMC" + userName,depth++);
                personMC.setName(userName);
                //调用方法
                instacne();
                serverCall();
                personAction();
        }
       
        public function instacne()
        {
                //是否连接服务器成功
                connect.onStatus = function(info)
                {
                        if(info.code == "NetConnection.Connect.Success")
                        {
                                trace("连接成功!");
                        }
                        else
                        {
                                trace("连接失败!");
                        }
                };
        }
       
        //服务端呼叫的方法
        public function serverCall()
        {
                var par = this;
                connect.userLogin = function(name:String)
                {
                        //根据名字复制一个新的mc,最近登陆的用户
                        var mc:MovieClip = _root.attachMovie("personMC","personMC" + name,par.depth++);
                        par.userSet.put(name,mc);
                        mc.setName(name);
                        //马上呼叫客户端,把自己的位置告诉新登陆的客户端
                        this.call("userInfo",null,par.userName,name,par.personMC._x,par.personMC._y);
                };
                connect.userAction = function(name:String,action:String)
                {
                        var mc:MovieClip = par.userSet.get(name);
                        mc[action]();
                };
                //更新已经登陆的用户
                connect.createUser = function(userName,x,y)
                {
                        //根据名字复制一个新的mc
                        var mc:MovieClip = _root.attachMovie("personMC","personMC" + userName,par.depth++);
                        par.userSet.put(userName,mc);
                        mc.setName(userName);
                        mc._x = x;
                        mc._y = y;
                }
        }
       
        //呼叫服务端的方法
        public function personAction()
        {
                var par = this;
                rootMC.onEnterFrame = function ()
                {
                        if( Key.isDown( Key.UP ) )
                        {
                                par.personMC.up();
                                par.connect.call("userAction",null,par.userName,"up");
                        }
                        else if( Key.isDown( Key.DOWN ) )
                        {
                                par.personMC.down();
                                par.connect.call("userAction",null,par.userName,"down");
                        }
                        else if( Key.isDown( Key.LEFT ) )
                        {
                                par.personMC.left();
                                par.connect.call("userAction",null,par.userName,"left");
                        }
                        else if( Key.isDown ( Key.RIGHT ) )
                        {
                                par.personMC.right();
                                par.connect.call("userAction",null,par.userName,"right");
                        }
                }
        }
}
在原来的fla文件的第二帧的代码全部删除,再加上这个就可以了
stop();
import soda.GameMain;
new GameMain(userName,this);

TOP

收藏了,顶一下~~~
关于生命与花的寓言……

TOP

顶一下,谢谢

TOP

弃天笑,能加我个QQ吗?我还有很多问题想求教,行吗?谢谢,我的QQ号:86250268

TOP

好的,有什么问题可以问我

TOP

用户组无法访问,晕啊

TOP

多谢分享

TOP

新加入的MC为什么不能和自己的MC放在同一个级别里啊?为什么要吧新加入的MC放在根目录呢?

TOP

FLASH FMS紧急招聘,回帖中!

你想与视迅中国以前飞翔吗?你想实现自身价值吗?你想拥有最跳跃和不箕的设计风格吗?
欢迎加入视迅中国(www.169v.net)的大家庭,从视频开始,从服务开始,从人机行为研究开始,我们将全程与您一起同步实现人生价值观!
视迅中国,全球华人视交娱乐服务机构,为用户提供全面优质的视频交流与娱乐造星服务,现用户100万,为高消费服务载体!为进一部分提升品牌竞争力,增强项目在资本市场领域的更高价值,特招聘如下职位:
1.高级Web-UI设计师
  企业将以设计为龙头地位,打造有价值产品,因此需要丰富的设计及策划能力并用,以实现良好的产品需求;
  有2年以上专业网站设计经验和基础,有大型网络公司经历;
  熟悉设计后续开发流程,会与技术与制作进行衔接;
  有产品规划及策划能力,能独立带领团队完成产品设计及规划任务;
  熟悉flash动画的制作;
  关注细节的悟性及把控能力,善于交流和沟通;
  性格活跃,有团队精神。
2.FLASH高级程序员
   熟悉FMS,flash视频等相关程序的开发和使用;
   能够利用AS2.0以上版本完成程序交互;
   有开发web游戏及相关程序的经验;
   有组织和协调能力,能够通过产品规划指定开发计划;
   思维活跃,学习能力强。
技术能力,专业操守,上升空间不大者,请勿扰!
以上专业职位一经录用,待遇丰厚(面议),企业提供充裕的个人上升计划,并可与前期原创人员一起分享项目成功的愉悦!
工作地点:中国 重庆 (特殊情况可提供住宿或相应补贴)
职业要求:全职(flash编程领域有独立产品开发团队或全案经验者,可考虑兼职)
联系人:王先生
联系QQ:490558
MSN:[email=ansen2002@hotmail.comansen2002@hotmail.com[/b[/email]]
SKYPE:chinaansen2008
email: ansen#169.net[请将#修改为@符号]

TOP

发新话题