做了半年手机游戏移植,有种身心疲惫的感觉.每天反复的阅读别人写的代码,很是郁闷.希望某一天能换个环境做做开发.哎.


首先要说的是,我在公司移植的主要是日本的手机游戏.多数需要汉化处理.少数涉及到跨平台的移植.
我所用的编程环境就是很普通的WTK+JDK.而且版本都是很低的,因为要符合中国移动的打包规范。然后再用一个文本编辑器写写代码。仅此而已。
手机游戏移植主要的工作是把原来的一款别的型号手机上的游戏。经过修改能在当前型号的手机上运行和使用的过程。所以可以把这个工作细分为几方面的事情:

-----------------------------------

1,处理屏幕尺寸

这也是最重要的一点。不同型号的手机。屏幕大小不同。分辨率不同。所以要保证每款游戏放在每种型号的手机上都能达到同样的运行效果。那的确是件困难的事情。所以移植的时候就尽量找差距较小的机型做移植。程序中需要注意的就是双缓冲的尺寸。和画面内容的位置。当然最愿意看到的就是能有个全局变量来控制整个游戏场景。

-----------------------------------

2,修改按键值

这是另一个重要的方面。确保游戏能够正常的操作的前提条件。比如NOKIA的机型的左右软键分别是-6,-7,而Motorola的C650的左右软键就是-21,-22。所以这种差别是无法回避的。除非你的手机游戏程序能够适应不同的机型产生不同的键值。我上个月做的一款游戏就是这样的。而且适应不同的屏幕大小。的确很不错程序。

-----------------------------------

3,处理内存占用

这是另一个无法回避的问题。如果你的手机性能不错。那也许你不用考虑。比如你做motorola E680的游戏。但是多数机型的内存容量是你需要重点考虑到的。我见过很多游戏移植到新机型时出现很多难以解释的问题。一般都是由内存不够引起的。比如图片无法显示。游戏无法安装。死机等现象。所以我们移植的过程中。就要事先计算好你的内存占用情况。把无用的对象设置为NULL。

------------------------------------

4,完整汉化

某些游戏是英文界面的。所以如果要符合中国移动的规范来做。还必须保证没有一个英文字符出现。不过这听起来也有点强人所难。 比如游戏中的LAP 1/3  赛道的第几圈。 你非要改成 圈 1/3 。但是也没办法。符合规范是你提交游戏的前提保证。汉化中可能出现的问题就是。如果文字被做成图片了,你需要通过美工的协助来完成工作。

------------------------------------

5,游戏的功能修改

很多时候如果你要保持与中国移动的规范相同。就要修改左右功能键的位置。以及还要涉及到给游戏添加暂停和继续的功能。甚至有时候你需要自己写个游戏菜单。并且添加一些LOGO界面。

-----------------------------------

上面提到的方面。多数都是移植中必须处理的工作内容。如果你碰到了难以让你下手的游戏。不要着急。因为代码不是你写的。如果你看着头晕,可以先从简单的入手。然后理清思路。下面谈谈我移植过程中一般的步骤。

1,查看资源文件

这是最重要的。是你修改游戏的前提条件。如果你连资源文件都不清楚是什么,那你无法完成剩下的工作。资源文件有几种。比如单纯的图片。PNG格式(日本DOJA的游戏图片格式是GIF)、声音文件、文本文件、数据文件等等。这里要提一下数据文件。我一般把除了图片,声音,文本以外的格式的文件都叫数据文件。不过这类文件是我不希望看到的。因为它不便于与修改。有些游戏为了读取资源的方便。和占用空间的考虑。会把图片文件做成一个数据文件来处理。以前我都是用Ultraedit把这个数据文件打开。然后一段一段的通过提取PNG格式的数据。然后从新保存成PNG文件。很麻烦。后来我自己写了两个工具。一个程序用来提取图片。一个程序用来从新生成数据文件。感觉方便了许多。

2,阅读代码的技巧

代码是必须得读的。否则就不叫修改了。但是也不用你都读懂,读透。毕竟是别人写的代码吗!(^_^看不懂的时候,想想这句找点心里平衡),而且不用每句都看全了,如果上万行的代码。你把每句看一遍。也够你累的。而且在BOSS规定的时间内完成不了。你也麻烦。我一般首先要看实现游戏主要场景和功能的类。也就是所谓的 Canvas类。因为这个类肯定不是自己启动的。要通过MIDlet主类加载。或者再委婉一些通过另外的类加载。所以其他的类都是辅助这个类来完成游戏功能的。然后看看这个类的导入了哪些包。继承自什么类。实现了什么接口。然后再看它的构造函数。以及paint()方法。如果有线程的话,还要看看run()里面的代码。这些就是这个游戏的主要切入点。控制着游戏的进程和绘图。其他的像游戏中的算法之类的东东。如果有时间。你就好好研究一下。这对你来说是很有意义的。

3,不要相信模拟器

做不同牌子手机,不同型号的手机游戏,肯定会用到模拟器来运行。看看效果。我觉得用看看效果这个词已经很贴切了。因为有些游戏模拟器都运行不了。你连效果都看不到的。所以必须要用真实的手机运行和测试。但是按键值也必须用真机测出来。虽然多数模拟器和对应的真机相同。

4,解决不同手机的BUG

最头疼的事情也就是这个了。会出现一些莫名其妙的错误。明明在这个手机上运行的很好。可是到另外一个手机上就出现意想不到的错误。比如无法安装。图片无法显示。玩到某个地方死机。声音无法播放等等。遇到问题先不要着急。冷静的回想一下代码和上一次修改的过程。如果都排除人为原因。那就从内存 和图片 来考虑。有些时候 repaint() 和ServiceRepaints() 也会出现问题。比如NOKIA 新 S60系统。 而且考虑问题不要太片面。因为游戏本身就是一个环环相扣的过程。

另外我还要说说手机内存的处理。这是个经典的话题。我这个无名小辈也都能谈及于此。说明它的确无法回避。什么String的使用, System.gc()之类的。以及将无用的对象设置为NULL。这些网上都有相关的讨论。以及static的用法。我只提一个地方。就是在手机加载图片时。听人说手机中计算图片占用的内存是:图片长×图片宽×图片颜色数×2。但是我没具体算过。不过感觉图片的内存占用确实和图片的面积有直接的关系。甚至一幅透明的图片和一幅单色的同样尺寸的图片占用的内存都是很接近的。另外要少用Graphics.drawString() 。有空可以自己写程序测试一下。如果你写了一篇文字。用了N个这个语句。那就应该看看。是否需要替换成一个String数组。或是做成图片占内存更少一些。

以上就是我这几个月的一点点感想。由于也是刚刚进入这个行业。很多都是在摸索。如果你觉得有些地方写得太幼稚。请不要见笑。把你的意见发给我。我会虚心接受的。希望各位朋友指正。也希望给正要进入这个行业的朋友一点实际工作体验

文章作者QQ:191971016   本人QQ:258420989

如果您要转载我的文章,请标明出处。并且保持文章的完整性。谢谢!


----------

Doja平台手机游戏移植标准J2ME平台方法

Doja平台是日本NttDocomo公司的产品。可以通过访问www.nttdocomo.com来获得更多的资料。这里要介绍的是Doja平台与标准平台的差异。一个标准的Doja手机游戏工程包括几个默认的文件夹。

/bin

/res

/sp

/src

bin文件夹存放的跟标准WTK工程文件中的文件夹是一样的,都是编译好的.jar文件和一个.jam文件。.jam文件类似jad文件。可以用文本文件打开编辑。里面有一些必要的项目。包括jar文件的相对路径.

res文件夹应该是存放资源文件的文件夹.(没具体研究)

sp 文件夹存放着程序中要用的.scr资源文件。这里简单的介绍一下Scratchpad的概念。

Scratchpad类似一块内存。但是具体是什么我上网查了一些资料也没确切的说明,也有说像手机中的硬盘的。但是每个工程中可以包含多个.scr文件存放在sp文件夹中.如果你下载了一个开发i-mode for Doja 的开发工具。里面就有关于Scratchpad编辑的设置。这个Scratchpad 在打包的jar文件中并不存在。好象是从网上下载下来用的。

scr文件夹存放着.java的原文件.

给一个代码片段:

DataInputStream in = Connector.openDataInputStream("scratchpad:///0;pos="+0+",length=12");

所以如果想修改到标准的J2ME平台就要把.scr这个文件搞明白。它这个资源文件基本上都包括所有资源。声音,图片,数据 等等。一般需要用十六进制的编辑软件将一些有用处的数据提出来。根据在程序中原来的读写操作进行判断。比如"scratchpad:///0;pos="+256+",length=12"  意思在.scr作为流的数据中偏移256个byte。 长度为12个byte的数据块作为DataInputStream流。可以用下面代码段替换:

DataInputStream din = new DataInputStream(getClass().forName("Test").getResourceAsStream("/Test0.scr"));

din.skipBytes(256);

我无法解释的更详细。因为我做这个东西比较少。只能说说大概。

把资源文件搞定后。开始分析程序。 Doja平台的程序跟普通J2ME平台程序的结构基本一样。只是所用的方法都是Doja自己的方法。需要自己写一些方法替换掉。最常接触的就是画图方法。drawImage();  这个方法在Doja的API说明中有很多个重载的方法。可以接收很多不同的参数。因为Doja有自己的方法,可以从一幅大图中单独画一幅小图。只要给定坐标和尺寸就可以。所以Doja的画图都是从一副大图中画一幅小图。Doja的接收按键的方法也不同。它有点类似MIDP2.0的方法。对按键的状态是进行判断的。所以很方便做按下和释放的事件处理。 在程序中都是才用位操作实现的。

我觉得Doja游戏移植的难点不是API的不同。而是内存的处理。因为日本的手机性能大部分都比国内的手机的性能好很多。包括网络连接。所以处理内存是个难题。

还有一点注意的就是在进行图象翻转,缩放,与变色的方法上。如果你要从写这些方法。要考虑处理速度的问题。就算你写的方法是可以实现原功能的,也会在速度差异上出现意想不到的效果。

对于程序的处理,我没有介绍很多。因为程序千变万化。如果你遇到什么难题或者需要实现什么方法。可以联系我。或许我这里有写好的。呵呵^_^

原作者QQ:191971016
原作者msn:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
本人QQ:258420989
本人EMAIL:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
如果您对我的文章转载,请您标明文章的出处,并保持文章的完整性。谢谢!