关于《J2ME手机游戏开发技术详解》的问题!

原创 2006年05月30日 09:05:00

这里只是对我书中的bug和没有说明白的技术处说明,对于具体的编程问题,我只是点到为止!

对于3D部分的问题,由于我现在工作重点不在这上面,有些问题的回答我感到吃力,也不太想回答,详情请看我的文章。

 

我看了你的超级玛丽里面的绘制地图那一块看了很多次了~还是不太明白.MIDP1.0真难搞.

这个地图的问题,确实比较复杂,当时书上我给了几张图来说明这个问题,不知道你那里不明白,给个具体的例子,其实也没什么复杂的,就是把一张大地图整个打碎,然后把相同的部分用一张图片表示,这个图片有个序号,显示的时候,按照数组里的序号来绘制就可以了

 

手机游戏开发技术祥解》书中3D部分的随机迷宫算法是怎样实现的,有空能解释一下么

关于3D的部分不是我写的,我还得去看一下书上怎么弄得,我最近比较忙,也就没看。

 

我读你的书时,做了几个程序做实验。可是总是出现以下的问题,Uncaught exception java/lang/OutOfMemoryError,我在网上也找了答案,可是效果甚差。
  后来我把本书中第14章那个逃亡飞机的程序(光盘自带的)运行时也出现了这样的问题,我想请问一下李老师,这是什么问题呀。我一直找不到答案,请李老师帮我解答一下。
  我以前学Java学了有两年的时间了,去年年底,我改学J2me了,可是又学了这么长时间了,一点效果也没有。感觉什么也不会,请问李老师这
是什么问题呀?我还想让李老师给我再推荐几本书,我现在大学快毕业了,马上要面临着找工作,我想这个问题不解决,可能会影响我的就业吧,请李老师帮我一下。
  学生在此谢谢了。

这里有个问题是你的模拟器的内存设置有问题,这个我在书中有写,具体在哪里我忘记了,你看一下,专门说让你修改模拟器的HEAP的。应该就是在那几章例子里。

我是在逃亡者的游戏闪屏画面出现以后就不动了,然后按下手机上的键,eclipse控制台那里就显示java.lang.IllegalArgumentException
然后不管按什么也还是这样,程序无法运行

你把你的程序寄给我吧,我可以帮你看一下。lizhenpeng@live.com

我在用诺基亚的模拟器运行‘逃亡者’游戏的时候 出现“java.lang.IllegalArgumentException”这样的错误,应该是参数非法吧,可是不知道是在哪里,请您给解答一下,谢谢!!

这个地方我也没法回答,你没说是在哪里,在什么情况下,你这样说我信息不足

李老师,您好~!我是刚开始学J2ME的,我在运行那个超级玛莉的程序时,为什么游戏好像只有很少的一部分,没有完整的一关的吗??是我运行出错了还是那个程序只是包括那么少的一部分呢?谢谢!

这个确实只有一部分,但是程序的基本结构都有了,往后不过是情景设置和物件的摆放,所以省略了。

李老师,您好,我是刚开始学J2ME的,我是用Eclipse开发的,在运行的时候,出现问题:Uncaught exception java/lang/ArrayIndexOutOfBoundsException.
不知道是什么问题,请您帮忙解释一下,谢谢!

这个是你使用的数组越界了,你检查一下程序中的数据是否超过了数组的大小。

李老师您好,我看书上的例子“网络对战扑克”,看不明白它们的流程,比如在书上589页就有如下代码:
out.write(sendBuffer,0,sendBuffer.length);
out.write(buffer2,0,buffer2.length);
我不知道服务器端要怎么判断哪些数据是sendBuffer,哪些是buffer2的?
我今天看了一整天,还是看不明白网络IO的读写,恳请您帮忙较为详细地讲解一下,好吗?谢谢!

关于发送数据的格式,请看一下关于DataHead的定义,这个是关于网络数据格式的,有一个命令字,还有一个是数据包的大小,sendBuffer是DataHead,而buffer2是发送数据的大小。DataHead中Size即为Buffer的大小。

网络IO的读写,对于TCP来说,必须指定的大小读写,这样当收到足够的数据,解析以下,看看下一步的动作。

李老师您好,多谢您上次帮忙解答问题!
但我还有一点不明白,就是关于那个“place += 4;”,您说是每个牌的图片宽度是4,但每个牌的图片宽度不只是4,我想这个“4”是不是指Card类里的4个变量:id,kind,num,reserved?

还有就是在书上的603页,在run()方法里有一句代码:MainForm.inst.userList.removeElement(this);
线程一直都在运行,这样写不会出错吗?
麻烦您帮忙解答,谢谢!

这里的4确实是位置偏移,你看一下,每张牌并不是完全显露,而是每张牌都压着一部分,这个正是每张牌的间隔。MainForm.inst.userList.removeElement(this);这个一句没有问题,userList这个是Vector类型,线程安全的,你看一下书中讲Vector和线程的一部分。

李老师您好,我想再问一个问题,在您的《j2me手机游戏开发技术详解》书上的“网络对战扑克”的例子那里,GameManager类里的代码:for(int i=0;i<27;i++)
{
this.userCard[i].fillData(this.recvBuffer,place);
place += 4;
}
其中的place为什么要+=4?

还有,代码:Card[] userCard=new Card[30];
为什么是30呢?

这两个问题我想了很久都想不出来,希望您可以帮忙解答。
期待您的回复,谢谢!

这两个地方写的不好,应该定义同意的静态常量表示,+4表示是显示位置偏移,每个牌的图片宽度是4。

而30,是由于总共有54张牌,每个人有30个牌位足够。没有别的意思,就是随手写了个30,做Demo用。

李老师您好,我想问一下在按键控制的代码那里:keyAction&=~LPKeyMask.MASK_KEY_OK;
这句代码有什么作用?特别是这个“~”的用途是什么?

这个代码是把按键控制位清空,~是按位取反操作符,你可以看一下Java语言规范。

按键控制代码在MainSprite的Action中。你可以看一下。


 

两个问题,都是关于您的大作《J2ME手机游戏开发技术详解》里面的Mario这个游戏例子:
 我的运行环境是P4 3.02GHz/JBuilder2006 SP1/Sun WTK 2.2和Moto SDK 6.2.1。
 1 无法Debug这个例子。我分别用Sun WTK和Moto SDK的模拟器运行Debug,都是进行到Loading 99%那里就停住了,直接Run就没问题。

Debug模式启动不了原因是Debug模式中,由于同时启动两个线程,时间相隔太近,在Debug模式下,实际上并不能同时启动,而release模式可以同时启动,因此关于进度条的实现方式并不是太完美,但是只有这种方式才是真正的进度条,真正根据资源载入而实现的进度条。其实这种模式的进度条在Debug模式下无法调试,你可以暂时把进度条去掉,应该就可以了。

或者采取如下的方式:

MarioMIDlet第41行那里改为gameLoading.gaugeCnt<gameLoading.PROGRESS_END,

这里gameLoading.PROGRESS_END需要由private改为public

 2 beat.mmf文件播放时抛异常。下面是用Sun WTK时的异常:
   javax.microedition.media.MediaException: Cannot create a Player for: application/vnd.smaf

是这样的MMF格式的声音在模拟器上并不支持,原因是MMF格式需要特殊的解码库,这个库并不是可以提供的,所以模拟器上并不能跑,你可以换MIDI格式的声音来播放,但是MMF格式的声音在大多数实际手机上都能够支持。

 

在Nokia7610上的j2me程序退出时,经常出现NullPointException异常(要有线程在运行),我觉得就是因为程序退出时,还有线程在运行,所以报空对象异常的,如果让线程安全结束之后,不会出现异常的,但我现在的问题是我用的不是全屏模式,所以系统出现一个退出按钮(是系统的,不是我做的),程序在运行时始终有这个退出按钮的,当程序有多线程运行时,同时又按下系统的退出按钮时,线程关闭是不安全的,此时容易报异常的,此种情况也可以解决的(在destroyApp()方法里安全关闭线程),但是现在的问题是我调用display的display.callSerially(new SplashThread()),SplashThread是一个实现了Runnable的类,在类中,又启动另外一个线程初始化程序运行时的各个参数,初始化参数比较耗时的,所以在另一个线程,但就在初始化参数的时候,如果按下系统的退出按钮,会报空对象异常的,请问这个问题怎么解决啊?

这个是有的读者通过blog给我发邮件,但是我竟然不能回复,因为没有地址。所以回答在这里。这种问题我比较喜欢,也比较有难度,我将给出详细的解释和解决方法。

麻烦您能否对书中3D方面的例子给个目录说明啊?尤其Explames那个包下的内容具体都是做什么的,这样看起来就比较方便了,另外很多用到线程的例子都缺少线程休眠。

这个问题比较麻烦,最近比较忙,像注释这种问题我一般不支持,你有问题可以问,但是我不保证能做解答。这里你说的线程休眠是什么意思?游戏中一般不用这个东西。

Graphics3D的render方法,须要自己定义的吗?我看到了光盘中的例子程序中,有这么一个构造方法 protected void render(int time){……},render不应该是Graphics3D内部方法的吗?

下面是render的示例用法可以参考

protected void paint(Graphics g)
{
Graphics3D g3d = Graphics3D.getInstance();
g3d.bindTarget(g);           //绑定绘图参数
g3d.render(yourWorld);   //传入你自己的3D参数
g3d.releaseTarget();       //强制画面更新
}

Graphics3D的render方法,须要自己定义的吗?我看到了光盘中的例子程序中,有这么一个构造方法 protected void render(int time){……},render不应该是Graphics3D内部方法的吗?
我在J2ME速查手册里面看到里面有几个render方法如:
(1)render(Node node, Transform transform)
(2)render(VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform)
(3)render(VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform, int scope)
(4)render(World world)
这么多个方法,我应该选哪个才对(针对我的程序),应该加上怎么样的语句,才能够使我的程序能显示出该画面。因为在你的书中,只有简单的几句,其它很多都是代码,而又没在书中说道须要用到render,也没讲render的用法,对于一个初学者来说,是件很艰难的事情,能帮我在我的程序中的哪个地方加入几句程序让画面显示出来吗,在此不胜感激~~~!!

你把书再仔细看看,这个render是提交操作,要把你绘制的Node传入,才能正确绘制,这个就好像是Graphics中的某些方法一样。

在run方法里面加入了这两句System.out.println(vertexBuffer.getVertexCount());
flushGraphics();运行程序只打印一个数值5,也就是构造三角形的点数。我应该在我的程序中如何修改才能把构造出来的三角形显示出来呢,请指教~~~~!!!

这里是你缺少Graphics3D的render操作。

 

第10.6.2 Canvas实现的闪屏程序,为什么要在run()方法中要入这两句:
repaint(0,0,width,height);
serviceRepaints();
Canvas类不是会自动调用它的自己的paint()方法的吗?而在
public void paint(Graphics g)
{……}里面不是对state进行判断了吗,而
public void drawSplahScreen(Graphics g)方法和
public void drawGameScreen(Graphics g)方法里面一开始就实现了清屏语句,我想去调repaint(0,0,width,height);
serviceRepaints();这两句应该没问题,但是去掉了之后,或者只去调第一句,只会得到364页的图10-3,不会转到第二个画面,而只去调第二句还可以顺利通过。为什么呢?

这两个方法是MIDP1.0的技术,repaint是确定绘制区域,serviceRepaints是绘制调用,cavas是会调用paint,但是它什么时候call,为什么call就是问题了,只有当你

repaint(0,0,width,height); //确定绘制区域
serviceRepaints(); //绘制操作。

他才会call canvas的paint方法,这里就是请求绘制的意思。

你去掉serviceRepaints是可以的,但是不会立刻绘制,而是等系统空闲才会绘制,这样就会导致屏幕刷新缓慢,因此需要用户绘图的地方,要强制刷新serviceRepaints

 

李老师您好,请问您书中关于3D内容中的代码,附带光盘中有些并没有完整代码,请问那里可以下载到?多谢。本人想学习一下3D内容,请问应该如何下手好?

有很多code是demo,是为了演示某种技术才单独编写的,至于完整的code,可以google一下,应该有完整的例子。

其中的 super.move(horizontalMove,0); 是不是让对应的背景图层在水平方向上平移horizontalMove个单位呢?还有super.的作用是什么,去掉了之后,剩下move(horizontalMove,0);也同样运行成功,为什么?

你对Java语言不是很熟悉,super是调用代表基类的引用,可以调用基类的方法。如果派生类有Move方法,使用super调用的是基类的,而不使用调用的是派生类的。

用后的时间, 用它们的时间差作为线程的停留时间,还有,那个数据80,是你经过多次实验得出的最佳数值,还是怎么 算出来的,如果是经过多次实验得出的话,倒不如像你下面注释了的那部分,直接用了个Thread.sleep (5)来代替?这样更加简单,我想其中必有你的原因,这样做的好处是?请教~~~~~!!!
这个问题是确保游戏中每一帧的时间是相同的,这样才不会造成游戏的不流畅,为什么采用80,是由于80msX12.5=1s,至少保证12帧以上,人眼才会感觉画面运动的。这个问题在后面的章节有详细的说明。

您好,您在第十一章中3D游戏开发入门里对于MorphingMesh的讲解代码中,Graphics3D.getInstance().render(iMorphingMesh,trans)(书中393页)这段代码中,render的方法中不包含MorphingMesh中的参数啊,请问这个方法应该怎样写,另外trans参数是什么意思啊?
以下是m3g包中的API关于render方法的内容:
render(Node node, Transform transform) ;

render(VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform);

render(VertexBuffer vertices, IndexBuffer triangles, Appearance appearance, Transform transform, int scope)

render(World world)

您的书对3D方面阐述很细致,非常感谢您做出的辛勤劳工。对我们有很大帮助。

此处的问题是这一个function:render(Node node, Transform transform) ,因为 MorphingMesh是Node的派生类,

trans是变换方式

第9章中的RPGCanvas.java的以下部分是如何对hero进行判断,以及如何让地图进行滚动,view[]的作用是什么?代码看得不是很懂?请教~~!!!

view[]分别代表当前游戏屏幕的左上点和右下点,控制当前游戏的显示区域,如果Hero的坐标不载当前view的范围内,则view进行相应的滚动。其实这个view就代表在一个大地图上一个小的可视区域,并且控制hero在此区域中,当hero在地图上的位置改变的时候,此view就跟随Hero改变位置。如下图所示:

地图位置不变,hero在地图上运动,当超出view范围的时候,view就做相应的移动,以显示地图。

不知道这样解释行不行,这个地方最好画图表示一下,否则只看程序很难理解。

如果使用对象池技术,那么怎么把得到的一个炸弹绘制到屏幕上/?
比如可以有6个炸弹,那么我从Bomb[i]中选取一个isVisible()是false的,然后把它绘制在屏幕上.但是却不能显示.
(我使用的是LayerManager方法.底层是背景,然后上一层是障碍物,再上面是主角,背景和障碍物是TieldLayer,用map.append()方法,而主角是Sprite,用map.insert()方法.然后更新绘制屏幕为: map.paint(g, 0, 0). 可是主角放置炸弹后,这个炸弹的Sprite不能从屏幕上看到. )

//下面是一个Bomb类

import javax.microedition.lcdui.game.Sprite;
public class Bomb{
Sprite[] Bomb=new Sprite[6];
Image tmp = null;
try
{
tmp = Image.createImage(image, 0, 0, 51, 18, Sprite.TRANS_NONE);
}
catch (Exception e)
{
e.printStackTrace();
}
for(int i=2*Num-1;i>=0;i--){
Bombe[i]= new Sprite(tmp, 17, 18);
Bombe[i].setFrameSequence(new int[]{0,1,2});
Bombe[i].setVisible(false);
}
}

//下面这个函数是在制定位置上绘制炸弹,但我不管在Bomb类中或//者在主Canvas类中调用都不能显示放置的炸弹
public void draw(Graphics g,int x,int y{
for(int j=Num-1;j>=0;j--){
if(Bombe[j].isVisible()){
Bombe[j].setPosition(x,y);
Bombe[j].setVisible(true);
Bombe[j].paint(g);
}

这个问题是由于你没有把bomp加入LayerManager,使用对象池技术就是把原来已有的再显示出来,并不是

新加入的再显示,我的第十五章里面对于绘图有详细的介绍,你看一下,也许对你理解GameApi有帮助。!

您好,我买了您写的《J2ME手机游戏开发技术详解》的书,我把光盘中附带的第十五章Mario游戏的源码导入eclipse中运行以后,屏幕只有两屏,而且没有敌物(乌龟),不知是否代码中没有包含敌物部分?

源代码是包括敌人的,乌龟大概是在屏幕的最后面,屏幕大概有4屏,能看到桥,乌龟在桥的附近。

我在编一个泡泡堂的手机游戏版本.我按照第九章的RPGDemo一样使用TiledLayer,Sprite和LayerManager的方法. 我使用TiledLayer绘制了背景图和障碍物层,全部分为10*10的行列格式(每一小格用象素为20*20的图片绘制.当然背景图不用管). 然后再使用Sprite方法绘制了一个两个人物,一个为玩家自己控制,另一个为NPC. 现在问题是玩家可以放置炸弹,炸弹爆炸可以炸掉障碍物,然后障碍物消失的同时随机产生一个物品,比如玩家吃了可以增加速度,可以增加炸弹数目等. 但这些单位难道全部用Sprite类来实现?那样岂不是要增加很多图层?比如说一个玩家可以放置6个炸弹,那就新建6个Sprite然后用LayerManager的insert()方法来绘制?

我现在暂时使用了一个方法:我把那些物品全部放在一张图片上,然后用TiledLayer方法来增加一个层.然后用碰撞检测方法,如果得到了true,那么就先得到玩家的X,Y坐标,然后算出于之相碰撞的图层的Cell的行列数,然后使用setCell(m,n,0),使这个位置的图片不显示. 比如说主角现在的坐标是(50,25),那么分别除以20(上面说过每个Cell是用20*20的图片填充的),那样就得到了两个值:2,1.如果主角按的是右键,那么表示在序列号为(3,1)的障碍物图层显示的图片不为空,那接下去就可以使用SetCell(3,1,0)是这个位置的图片显示为空.那样看上去就像是主角把这个物品吃了. 但这个方法的缺陷是显示的物品都是静态的,而且现在用来计算主角处于那个矩阵序号中的函数还不太准确.

李师父,你能否给我几个提示?
1.如果用我的方法,那怎么才能使物品为动态的,而且能有好的函数确定主角的位置吗?

这个问题可以使用对象池技术,和对象属性设置为visible=false不可见.

使用的时候,初始化位置和设置visible=true即可

2.如果别的方法,能稍微详细说一下吗?

你可以参考后面的章节,滚屏游戏设计

3、对象池技术的核心观点和使用原理, 具体的应用可以参看我的书《J2ME手机游戏开发技术详解》第15..5.2节,里面有详细的介绍。所依据的理论在《根据J2ME(MIDP)虚拟机对程序编写的优化方式》一文中有详细的补充。


 

 

Q:书中15章提供的MapEdit.exe,不能正常用?不能导入png做图哦?能说一下用法吗?

另外可用mapwin作图导出的数据吗?

 

A:第15章提供的MapEdit并没有说明详细的用法,我在这里补充一下,此MapEdit是与源代码一起提供的,并不能编辑png图片,主要原因是png图片解析复杂,需要做转换,而此工具只是一个简易的工具,因此只提供bmp图片的编辑功能,如果读者要想编辑png图片,需要自己撰写mapedit,这个其实也不是很复杂,由于一些原因,此简易的Mapedit的源代码我丢失了,一直也没有重新写,因此不能在这里提供给大家了。其实,在使用前,应该先导入bmp图片,然后设置地图的图块大小和地图的大小(长X宽)像素,然后就可以看到了,此地图编辑器有一个最大的问题是不能卷动,因此不能编辑大的图片。

其实很多通用的地图编辑器都可以使用,只要导出的是标准的十进制或者是十六进制数据即可。也就是如下形式:

1,2,3,4,5或者0x1,0x2等。

我的程序里有一个碰撞标志,这个需要单独的工具写入,书中没有提供,读者也可以手动写入。

Q:现在的j2me的书太多了,你有没什么太多的开发经验,写出的书,哎,谁看啊 ,只做了一个游戏就敢出书了~,而且看起来,好象适配的机型还还不多,做过多语言版本吗?真不知道,出书是为了赚钱还是为了出名~~~恐怕出的书也是误人子弟吧

A:可能我的初衷里写的不是很详细,我自认为我的书对得起读者,里面展示的内容此书的价值足矣,可能比不上很多大师的作品,但是里面提到了许多J2ME开发中常见的问题,而且从已经出版的其它书看来,很多书对于技术问题都躲躲闪闪,并没有清晰的点明。

我承认我做J2ME的时间不是很长,但是接触的都是最底层的问题,对于其中很多问题都提出了比较完善的解决办法,我有很长时间的底层开发背景,因此对于底层知识了解的更多。我大概作了有6款游戏,由于联通的UniJa机型有限,很长时间内款数比较少只有3款,但是我的程序不做任何更改,我测试过我见过的所有的支持J2ME的手机,都可以完美的支持(除了JAR大小限制)。顺利移植过Nokia的智能机和SE的手机, 我见过的支持J2ME的手机不多,但是支持BREW的手机很多(几乎所有的上市手机),很多手机的问题都相似根据BREW的经验可以顺利解决J2ME的问题。

关于游戏的种类,像比较简单的推箱子等,更本无法商业运营,只能够做比较复杂的游戏才能够顺利运营,因此一上来都放弃了简单种类的游戏。

游戏的多语言版本因为把字符串放在资源在中,根本不用更改程序,只更改相应的字符串即可,如果还需要更改程序,就是程序的失败了。


Q:你说你写的程序能顺利的在nokia和别的机器上运行,我不知道你对图片怎么处理的,nokia有自己的包,这个也是被移动认可的,而2.0的包,在图片的处理上与nokia的效果是差不多的,但函数是全然不同的,而1.0图片 处理的效果就很差,如果想作到和nokia和2.0一样的效果,就要多出n倍的图片,我不知道你是针对哪个机型做的处理。当然最简单的方式针对1.0写出代码(这样所有机型都适配),但这样我相信在58.5k或者195k的容量压力下,你游戏的质量恐怕~~~。

A:这个问题,对于1.0和2.0我统一使用8位的PNG图,对于PNG的处理解码过程应该是一样的,因此次所谓的效果差不过是手机屏幕显示的问题,如果是64K TFT,哪怕是1.0效果也是相当的好。58.5K的大小确实是有点小,不过完全可能做到,游戏中地图的数据那可是相当的大,我的程序中资源反而不是很大,而数据非常的大。如果要求的size小,则手机内存也小,过多的使用图片也没有意义。


Q:多语言版本不是翻译语言那么简单,最麻烦的是排版的问题,汉语的字体大小和英语是不一样的,我不知道你所谓的资源包换了之后在屏幕上的显示效果是否一样的。
A:如果是单纯的菜单项,这个与设计有关,一般来说为了保持漂亮使用图片来替代,而对于文字来讲,一般需要使用程序进行自适应的处理,不能单纯位置替换。

Q:.j2me和brew的到底哪个更普遍的问题,首先,移动支持的是java,而联通一边支持java一边支持brew,你说你看到的都是brew的机器,我很奇怪,难道你周围的人大部分都是联通的用户,而且他们也正好用的是brew的?其次,市场效益来看,移动的无线游戏这部分的收入每月恐怕是百万或者千万来计量的吧,而unija估计也就十万数量,而brew的不太清楚,但好象要是一个游戏一个月拿到10w的收入就很高了吧,呵呵,这个在移动也只是在百宝箱排在前几名的一个游戏一个星期的收入吧(而且还是很平常的收入,如果碰到好的游戏一周就可以收到几十万的)。我对市场不太关注,数据有可能有些出入,但不可质疑的是,j2me绝对比brew市场大,而且钱也多。

A:我工作中见到的BREW手机居多。平时见到的手机,BREW的反而很少,但是哪个赚钱,我确实不知道,J2ME的版权保护目前来说没法做,但是BREW的版权保护做得好,根本不可能从一个手机里弄出程序,即使弄出,由于有数字签名,也无法在别的手机复制,而J2ME标准虽然有这功能,但是目前大部分手机不支持。


Q:关于机型的问题,brew大约是30个左右的机型吧,但芯片好象基本上是2种arm7和arm9吧,没认真做过,好象抛开屏幕问题改出这2个版本就基本上可以了,而且这个是全世界一样的标准吧,而j2me,移动是要做8个基本机型,后续就不知道了,做下来大约20~30吧,当然里面有很多性能和屏幕是差不多的,但因为他们用的芯片和操作系统的不同,里面有很多莫名其妙的问题。再加上unija的大约3个型号吧。你可以做一个看看,有很多问题是你想不到的,当然你说用1.0的就可以全部满足了,但你想想你做了一个在486上能跑的游戏,这个游戏拿到现在主流电脑上也可以完美运行,但游戏性还有吗?我们是不会做这样的游戏,做游戏有时就是要牺牲些通用性追求下效果的!所以你说你做的游戏能很好的适配很机型,我持怀疑态度~~。

A:BREW也是只有一个抽象层,不同OEM的实现也不一样,问题也是很多。而J2ME是基于虚拟机的,虽然仍旧可能有较大的问题,但是据我所知,问题几乎都是出在声音上的,具体原因如果对声音芯片有了解的话,也不难解决。
我说的游戏是集中于我做的那类,应该叫做平面动作类的,由于有屏幕滚动的设计,因此可以适应很多版本。但是在实际中,一般来说会做两个版本不同的设计,因为目前主流的LCD基本上三种尺寸128X128,128X160,176X220并不需要设计那么多的屏幕版本,在这三个不同的分支上做修改即可。

Q:.java是可反编译的,对于资源文件的处理,我想说,没有别人破解不了的,只是别人想不想了,破解只是一个时间问题。你想想所谓混淆,就是把函数和变量名称改变了,函数结构70%以上都没有变,只要有充足的时间,所有的j2me的工程我敢说,我都能给还原70%以上出来,而且我想了解的地方基本上都能还原的。
A:资源文件确实可以破解,也没什么意思,因为你可以取得所有的J2ME程序,他没有保护,如果要是有数字签名机制,无法拷贝的话,还原也没有什么意思。资源文件的处理,纯粹是为了减少文件的空间。没有防止破解的意思。


Q:程序框架,现在估计是真正在cp公司里的人都知道把面向对象和面向过程结合起来,对于成员变量的读写,恐怕没有人想用set和get的方式吧~

A:但是目前公开的复杂点程序,有几个是真正的商业版程序呢,大部分程序架构设计的一个比一个漂亮,这会误导很多人的。我的书中的程序虽然很多很简单,但是毕竟使用在了商业版程序上的。


Q:最后说下,你写这本书真的很没必要,你可以先看看出版的书,是否满足大部分人的需要,不满足,他们需要的是什么,你知道吗?你能满足吗?说不好听的,你才做了几个游戏,就能解决那么多人需要?恐怕有些问题你都没见过吧!而且现在网络很发达,有什么的到网上发帖子问下,csdn上很多人会给你回答的,或者找个j2me的开发群,现在这个样的群多的数不过来~~~。除非这些你都不会利用!!
A:这本书写的有没有必要,我想如果按照给我的价钱让你写,你也不会写,有这个时间还不如写个游戏卖了赚钱多,我当时的情况比较特殊,如果现在让我写这么一本书,我是绝对不会写的。写本书是出版社有需求,而我又有时间写,就写了,至于满足什么人,定位是什么,这个是出版社定的,我并没有这个权力。如果你有时间写,可以联系一下出版社,把你的掌握的说一下,我也想看看别人是怎么写J2ME程序的。但是我想如果你现在正在写J2ME程序的公司,你如果把你知道的都写在了书上,你应该会违反了公司的保密协议,这个就是由那么多的高手知道很多问题,而无法写书。


Q:哎,楼主我不是想打击你。你还是先写本brew开发的书的吧,不管写的怎么样,我都会去买一本的,没办法,现在只看到一本啊,而且其滥无比要什么没什么,还不如api文档呢!你的就是第2本!把你的brew的经验拿出来,我想一定有很多人会乐意接受的!!
A:BREW的书我已经写了,在blog里有说明,但是确实水平有限,因为书的定位在入门级。我必须把所有基础的问题都讲到才可以。

Q:您好,我买了您写的《J2ME手机游戏开发技术详解》的书.在第九章中的9.6.7中的实例:GameApi实现RGP游戏.这一节中,如果我想在地图上增加一个敌人的图象,该怎么增加?我在 Hero类中增加了一个getEnemy()的方法.然后在RPGCanvas()类中增加了以下代码:
loader = new Hero();
loader.load(); //这个方法我也改了一下,可以创建两张图片
......
enemy=loader.getEnemy();
enemy.defineCollisionRectangle(0,0,enemy.getWidth(),enemy.getHeight());
map = new Map();
map.insert(hero, 0);
map.insert(enemy,0);
结果就出错了,出现以下提示:
Uncaught exception java/lang/ClassCastException.
但如果我没写上 map.insert(enemy,0);就编译通过,运行出来的画面跟原来的一样. 那如果想添加一个敌人出现在地图上,该怎么添加/?

A:这个地方是你对面向对象的理解有点问题,map.insert插入的对象,必须是从layer类派生的,而你的这个对象我现在无法知道是从哪个类派生的。但是从你的编译错误可以看出不是layer类或者派生类,因此无法增加敌人,你只需要增加一个从layer类或者是派生的类,然后创建对象,加入map即可。而且你如果添加新的sprite,在layer的index不能相同,否则不能正确设置,因为后面相同的layer对象将覆盖前面的layer对象。

你应该使用如下的方式增加:

map.insert(hero,0);

map.insert(enemy,1);

这里还有一个问题就是,你怎么可以从hero类getEnemy呢?这样Enemy就和Hero关联到一起了,你可以写一个SpriteManager类,用来生成getEnemy和getHero,这样才是正路! 

 

 

 

 

 

 

j2me手机游戏开发

从Java EE到Java ME的通讯 前言   本文源于 2005 年底一个真实的手机项目。很早就想为那个项目写点什么了,至今才提笔,也算是了却一个心愿。虽然时隔两年,但技术本身并没有发...

J2ME游戏开发中的双缓冲技术

双缓冲的原理:         在手机游戏开发中,可能一个完整的游戏界面需要很多图像的绘制,而在绘制过程中手机屏幕需要不断显示,如果该界面的游戏图像元素太多,很可能当前帧还没有绘制完成下一帧的绘制任...

22—(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发

由于写书的缘故,博文更新缓慢,大家体谅,今天针对群内常提出动画实现的问题来进行一个详细讲述; 此章节适合没有做过游戏开发的同学学习!        做过Android软件的童鞋们,在学习游戏开发的时候...

J2ME手机游戏开发技术的详解

  • 2009年05月19日 14:27
  • 12.09MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于《J2ME手机游戏开发技术详解》的问题!
举报原因:
原因补充:

(最多只允许输入30个字)