第二节 网络游戏开发的基础理论
好了,现在我们开始吧,在这里实际教程中,为了简单学习化,就不采用图片,只用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 编辑 ]