发新话题
打印

flash网络游戏基础(二)

flash网络游戏基础(二)

第二节 网络游戏开发的基础理论
好了,现在我们开始吧,在这里实际教程中,为了简单学习化,就不采用图片,只用flash的简单动作来做网络游戏的通讯。(觉得罗嗦或者已经会的人可以不用看)
个人觉得做flash网络游戏的话,比较好的结构是flash + c++ + java比较好一点。也就是说flash做客户端,C++做网络通讯,而flash就做WEB层的,包括单个用户的读取数据等。.老实说,我是不怎么会教人了,在这里就只讲一点点基础而已。要做网络游戏,肯定是要用到Socket的通讯了。这里服务端是采用java程序了(呵,因为我是个java程序员)。
而flash方面就要用到XMLSocket了。利用这个网络通讯,通过服务端的信息转发,就可以让所有的客户端同步信息了。
    我不知道其他人是怎么想同步所有客户端(在同一个场景)人物同步的。我在这里才用的是接受其他玩家的动作命令,然后在自己的客户端上作相应的动作,从而实现同步。而自己人物移动的每一个动作也是传到服务器转发给他其他玩家。好了,就说到了,其他的在配合实际的制作中讲解吧。
(
------开始弄错了,现在把源文件弄上来的,注意IP的问题以及要把game.swf打包成game.exe才行-----
-----------------
新建一个flash文档,大小为800*600,帧频为:30(游戏一般都是要在30帧以上的)
在flash建立一个mc,就命名为personMC,再设置连接属性为personMC。(选中该MC,点右键,就可看见链接的字,选中)
接下来是写一个flash的类,用来控制这个mc的动作的,代码如下:
/*
  *该类主要功能是对传进来的mc进行控制,也就是控制动作
  */
class PersonAction
{
private var mc:MovieClip;
//mc移动的速度
private var speed:Number = 5;

public function PersonAction(mc:MovieClip)
{
  this.mc = mc;
}

public function setMovie(mc:MovieClip)
{
  this.mc = mc;
}
public function getMovie():MovieClip
{
  return mc;
}
/*
  *  <p>控制主角的动作</p>
  */
public function rightRun():Void
{
  mc._x += speed;
}
public function leftRun():Void
{
  mc._x -= speed;
}

public function up():Void
{
  mc._x -= speed;
}
public function down():Void
{
  mc._x += speed;
}
/*
  *  <p>结束控制主角的动作</p>
  */
  
  /*
   * 删除该mc
   */
public function removeMovie():Void
{
  mc.removeMovieClip();
}
}
这个代码太简单了,我就不在解释了。

在该mc里应该新建一个动态文本,放在图形上放,命名为userName
然后在flash中建立如下的帧:


再第一帧的interface中,加载如下的组件


其中标签为clew,文本框为userName,按钮为loginBtn
在action层中的代码如下:
stop();
//用户名
var userName:String;
//声明一个socket
var mySocket:XMLSocket = new XMLSocket();
loginBtn.onPress = function()
{
//如果没有输入用户名
if(nameText.text.length ==0)
{
  clew.text = "<font color=\"#FF0000\">请输入用户名!</font>";
}
else
{
  userName = nameText.text;
  //连接到服务器
  mySocket.connect("localhost", 5000);
}
}

//事件,当连接服务器成功或者失败时加载的
mySocket.onConnect = function(myStatus)
{
if (myStatus)
{
  play();
}
else
{
  clew.text = "<font color=\"#FF0000\">连接失败!</font>";
}
};
在这些代码主要是来验证用户输入的用户名以及连接服务器情况的
现在,我们来看第二帧的代码了
首先要声明一下要用到的东西(在var层)
//玩家控制角色mc
var personMC:MovieClip;
//建立一个ket与value的集合
var personSet:HashMap = new HashMap();
//定义mc的层
var layer:Number = 1000;
在function层里一定了如下两个函数:
//定义发送消息的函数
function sendMessage(msg:String)
{
mySocket.send(msg + "\n");
}
//其他玩家控制角色的走动
function personAction(msg:String)
{
var temp:String = Tools.ReduceString(msg)
var tempArray:Array = temp.split("#");

//其他用户的四种状态
switch(tempArray[0])
{
  case "1":
   //从集合里取出对应的玩家,再执行相应的动作
   personSet.get(tempArray[1]).up();
   break;
  case "2":
   personSet.get(tempArray[1]).down();
   break;
  case "3":
   personSet.get(tempArray[1]).leftRun();
   break;
  case "4":
   personSet.get(tempArray[1]).rightRun();
   break;
}
}
//接受信息方法
function acceptMessage()
{
mySocket.onData = function (msg:String)
{
  //如果是其他玩家的动作
  if(msg.indexOf("person") == 0)
  {
   personAction(msg);
  }
  else if(msg.indexOf("newPerson") == 0)
  {
   trace("有新用户:" + msg);
   //当有新的用户登陆的时候,复制新用户
   layer++;
   var temp:String = Tools.ReduceString(msg)
   var mc:MovieClip = Tools.makeMovie("personMC",temp,layer,200,400);
   mc.userName = temp;
   var p:PersonAction = new PersonAction(mc);
   //把新用户放进集合里
   personSet.put(temp,p);
   //向新登陆用户发送自己的信息
   sendMessage("newUser:" + userName + "#" + personMC._x + "#" + personMC._y);
  }
  else if(msg.indexOf("exit") == 0)
  {
   
   //如果有用户退出的信息,删除该用户
   var temp:String = Tools.ReduceString(msg)
   personSet.get(temp).removeMovie();;
  }
  else if(msg.indexOf("newUser") == 0)
  {
   trace("添加老用户:" + msg)
   layer++;
   //当用户第一次登陆时接受其他用户的角色信息
   var temp:String = Tools.ReduceString(msg)
   var tempArray:Array = temp.split("#");
   var mc:MovieClip = Tools.makeMovie("personMC",tempArray[0],layer,tempArray[1],tempArray[2]);
   var p:PersonAction = new PersonAction(mc);
   mc.userName = tempArray[0];
   personSet.put(tempArray[0],p);
  }
}
}
在flash第二帧中的action层里有这些代码:
stop();
// 把用户名发送过去
sendMessage(userName);
//复制该玩家
personMC = Tools.makeMovie("personMC",userName,layer,200,400);
layer++;
personMC.userName = userName;
//把mc传进角色类
var part:PersonAction = new PersonAction(personMC);
//调用接受信息的函数
acceptMessage();
//flash每一帧的动作
this.onEnterFrame = function ()
{
if( Key.isDown( Key.UP ) )
{
  part.up();
  sendMessage("person:1" + "#" + userName);
}
else if( Key.isDown( Key.DOWN ) )
{
  part.down();
  sendMessage("person:2" + "#" + userName);
}
else if( Key.isDown( Key.LEFT ) )
{
  part.leftRun();
  sendMessage("person:3" + "#" + userName);
}
else if( Key.isDown ( Key.RIGHT ) )
{
  part.rightRun();
  sendMessage("person:4" + "#" + userName);
}
}
这些代码也很简单,无非是相应键盘时间,然后把封装消息发送给其他玩家
那么简单的网络通讯,客户端flash就完成了,接下来的是服务端java了!
附件:

[ 本帖最后由 弃天笑 于 2006-11-29 18:18 编辑 ]

附件

flash网络游戏基础.rar (436.43 KB)

2006-11-29 18:03, 下载次数: 731

flash源文件

TOP

不错的文章,,怎么没有附件了?

还是觉得flash +C++要好一点.我们公司就是的.

个人喜好中.JAVA也有java 的好.那天学学flash +c#.
http://www.wolf2999.cn

TOP

XMLSocket好在简单.

原来用flash remoting.连到AMFphp 做过一个聊天室的.

在flash 8下面觉得还是remoting好且的.
http://www.wolf2999.cn

TOP

不好意思,因为最近在培训,所以上网不方便,现在重新上传源代码了

TOP

发新话题