目标手机软件
手机网游制造之数据处理篇
开发程序:疯狂的
开发进度:第三期
本期要点:设计服务器端数据处理功能
开发平台:Java平台
手机网游只有客户端是玩不起来的,必须要有服务器端。开发服务器端,最核心的就是设计服务器端的数据处理功能(完整的实例程序请到http://www.shudoo.com/bzsoft下载)。
在一般的服务器端程序中,服务器端程序主要包含数据存储、程序逻辑控制和网络编程等部分,数据存储和程序逻辑控制结合的比较紧密,可以统称为数据处理。为了方便网络数据的传输和整个程序的维护,程序的服务器端最好跟客户端的开发语言一致。
PC上程序的服务器端开发,对安全性和响应时间等要求都比较苛刻,要求数据传输处理快、存储安全,响应时间短。不过手机程序的网络传输速度相对PC要慢不少,所以手机网游的服务器端要求相对较低不高,开发也更容易。
服务器端数据处理设计思路
当客户端第一次连接服务器端时,服务器端分配一个唯一的用户ID给客户端,在客户端获得该用户ID以后,每隔一定时间向服务器端查询,看服务器端是否有匹配的用户可以进行对战。
如果没有则向客户端反馈继续等待的指令,如果有匹配的用户则为这两个客户端分配房间ID,并生成地图数据信息,开始游戏对战。进入游戏界面以后每隔一定时间获得一次地图数据,当用户移动角色时向服务器端发送移动指令,服务器端根据客户端的移动请求进行逻辑处理并对应的修改地图数据(见图)。
当客户端连接到服务器端时,服务器端进行逻辑处理,分配一个唯一的用户ID给客户端。在获得房间ID时实现的思路和用户ID实现一样,而对于游戏界面的地图数据,包括各个地图块的数据和玩家位置、方向等信息,则使用Java中一个自定义类进行代表,每个房间的数据就是该类的一个对象。
分析数据处理技术
在《疯狂的》游戏中,要处理的数据主要有三种:用户ID分配逻辑、玩家分配逻辑和玩家移动控制逻辑。用户ID分配逻辑是为玩家分配唯一的编号,比较简单;玩家分配逻辑是将处于等待状态的两个客户端分配到一个房间,并初始化游戏数据的逻辑;玩家移动控制逻辑是判断玩家是否可以实现移动,并修正移动以后的游戏数据,比较复杂。
玩家移动控制逻辑的原理如下所示:在游戏界面中,依次存储每个单元格中显示的图片序号,玩家也按照行号和列号来存储位置,整个界面是一个11行10列的区域,所以在移动是按照单元格判断移动即可。在移动时,先判断当前用户ID是对战玩家中的用户1还是用户2,然后判断以后的单元格是否超出地图区域,如果没有超出地图区域则按照移动方向,修改玩家的行号和列号。
服务器端数据处理设计步骤
第一步:创建项目
启动Eclipse,选择“File→New→Java Project”,设置项目名称为“BomberServer”,并一路选择“Next”, 完成项目的建立。然后新建一个入口类,选择“File→New→Class”,设置名称为“Server”,点击“Finish”。创建项目的代码下载地址是http://www.shudoo.com/bzsoft。
第二步:创建游戏数据类
选择“File→New→Class”,设置名称为“GameData”,点击“Finish”完成游戏数据类的创建。然后输入该类的代码,其中关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
/* 界面相关数据 */
/** 盒子层地图数据 */
byte[][] boxMap = new byte[ROWS][COLS];
/** 树木层地图数据 */
byte[][] treeMap = new byte[ROWS][COLS];
/** 房子层地图数据 */
byte[][] houseMap = new byte[ROWS][COLS];
/** 草丛层地图数据 */
byte[][] brushwoodMap = new byte[ROWS][COLS];
/** 层地图数据 */
byte[][] bombMap = new byte[ROWS][COLS];
第三步:数据处理
选择“File→New→Class”,设置名称为“LogicEngine”,点击“Finish”完成数据处理类的创建,该类包含所有游戏数据和数据处理的代码,关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
if(userID == userID1){ //用户1
c = playerC1;
r = playerR1;
playerDire1 = dire; //改变人物方向
}else{ //用户2
c = playerC2;
r = playerR2;
playerDire2 = dire; //改变人物方向
}
//边界检测
if(isInMap(c,r,dire)){
switch(dire){ //根据方向移动
case DIRE_UP:
r--;
break;
case DIRE_DOWN:
r++;
break;
case DIRE_LEFT:
c--;
break;
case DIRE_RIGHT:
c++;
break;
}
//移动到的单元格无内容
if(isSpace(userID,r,c)){
movePlayer(userID,dire);
}else{ //不能移动
//推箱子的情形
pushBox(userID,c,r,dire);
第四步:运行程序
在Eclipse主界面左侧的“Package Explorer”中,选中项目源代码Server.java,单击鼠标右键,选择“Run As→Java Application”即可运行程序。
读者反馈
开发QQ群:看了上期的文章有一个疑问,手机网游开发中,必须要用到监听模式吗?有其他替换的方式吗?
小编:是的,必须使用监听模式,没有其他方式替换!这就如同网络通信要用到HTTP协议一样,是必须的。
开发QQ群:我想请教一下,如何在程序中添加弹出菜单的功能,弹出的菜单后如果没有点击则自动隐藏。
小编:设计弹出菜单可以用popmenu,不同的平台具体使用方法不同,你要根据自己的情况处理。弹出的菜单一般不需要手工行关闭,当失去焦点或焦点转移时,菜单就会自动隐藏。
开发QQ群:我的程序老报错,Exception in thread "main" java.lang.NoSuchMethodError: Box.
小编:在源代码BoxDemo7.java文件的第21行中,调用的Box类的构造方法不存在。建议你阅读一下Box类的源代码,查找一下在BoxDemo7中要调用的构造方法是否存在。
开发QQ群: 我最近才看到《电脑报》在讲手机编程,我想问问Windows Mobile的开发工具在哪里下载?我在很多软件下载站都没有看到。
小编:专业的软件很多软件下载站都没有,这很正常。建议你去微软官网直接下载。SDK下载地址:http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows Mobile 6 Professional SDK Refresh.msi。
简体中文模拟下载地址器:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Professional%20Images%20(CHS).msi。
读者问题:在手机来电时立即暂停程序,这个功能是怎么实现的?
高手 ttu:不同平台实现的方法不一样,不过思路是相通的,我抛砖引玉说说思路吧。在J2ME技术中,实现手机来电时暂停功能的方法有两种:
方法1:利用MIDlet类的生命周期知识。在手机来电时,系统会自动调用MIDlet子类中的pauseApp方法,只需要将暂停程序的代码写在该方法内部或在该方法内部进行调用即可。
方法2:利用Canvas类的知识。在手机来电时,如果当前显示的界面是Canvas类的子类,则系统会自动调用Canvas类的hideNotify方法,只需要将暂停程序的代码写在该方法内部或在该方法内部进行调用即可。
对应的,如果在通话结束的时候继续程序,则对应的将继续的代码写在startApp或showNotify方法书写代码即可。
读者问题:我的公司要开发药品管理系统,要支持PDA,能给我一些建议吗?
你是手机编程的高手吗?你能解答上面这位读者的疑问吗?不要犹豫,来我们这里展示一下你的风采吧,来信请发到[email protected](也可以给我们发送问题)。
第八个QQ群: 57137039,验证码:陈邓新。欢迎对手机编程感兴趣的朋友加入。
(陈跃峰 辛涛)