g.drawImage(cmcc_logo,x,y,0);
cmcc_current_frame++;
}
…
}
添加上述代码后,cmcc_logo已可以正常绘制到屏幕上,我们需要做的只是添加一键跳过的代码就可以了。
经验提供者:
郭金鑫
一般情况下,我用的是状态来添加
3.索爱K700C,是MIDPCanvas在keyPressed中调用getGameAction()后,左右软键的键值可能会失效,原因之一可能是因为getGameAction会抛出异常。
遇此问题可尝试将getGameAction包含在try{}catch(Exceptionex){}中。
经验提供者:
郭金鑫
了解机型参数,提前设置左右软件键值
4.索爱K700C支持NOKIAAPI,但是getWidth和getHeight在两个机型的类库中处于类层次结构中的不同位置,因此编译生成的字节码可能会产生问题,解决办法是将程序中调用getWidth和getHeight的代码替换为常量,如176和208。
经验提供者:
郭金鑫
了解机型参数,尽量用屏幕的固定大小来定义宽高
5.索爱K700C的FullCanvas全屏尺寸为176x208,在真机上的运行效果为屏幕上下各有一条黑边,解决办法是将FullCanvas用Canvas替换。
另外,索爱K700C的FullCanvas中的getGameAction不会抛出异常(与Canvas不同),修改时要注意。
经验提供者:
郭金鑫
同上
6.索爱K700C在使用UTF8格式byte[]创建String时可能会出现问题,很多游戏在索爱K700C上暴内存也是由此引起的,解决方案是将资源中字符串提取出来,放到源码中,并将源码格式转为UTF8格式。
经验提供者:
曲艺
源码转换格式,记下了
7.很多机型在屏幕切换时对showNotify和hideNotify以及pauseApp和startApp的调用可能并不符合SUN的官方规范,但是在屏幕切换时或挂起返回时必定会调用某几个方法,这里提供一个通用解决方案。
如下:
在startApp中添加对showNotify的调用,在pauseApp中添加对hideNotify的调用,并将主要代码逻辑放在showNotify和hideNotify中。
经验提供者:
郭金鑫
屏幕切换可以用状态来解决此问题
8.三星D508,在左右软键按下并释放后,有可能会只调用keyPressed,而不调用keyReleased,但这种情况只是偶尔发生,解决办法如下:
在keyPressed中判断当前按下的键是否为左右软键,如果是的话,则手动调用keyReleased。
此种修改办法不适合的情况如下:
1.游戏的按键逻辑全都在keyReleased中的话,可能出现问题,可把按键逻辑放到keyPressed中。
2.如果游戏支持长按键的话,此种解决办法必定会出问题,目前没有解决方案。
经验提供者:
曲艺
由于目前无法解决此问题,尽量避免一下吧
9.索爱机型,如果setFont的参数设置不正确,则可能在游戏运行过程中抛出异常,解决方案是设置成其他字体。
另索爱机型的drawString锚点设置不正确也可能会抛异常,大家在做的时候注意一下。
经验提供者:
郭金鑫
要注意索爱机型的字体问题
10.目前有很多游戏中使用了多个Canvas类,当多个Canvas切换时可能会出现白屏现象,解决方案是合并多个Canvas类,但大家绝对不要硬生生的将两个Canvas类的代码进行合并,而是应该通过抽取出具体Canvas类的接口,再使用一个新的Canvas类来调用此接口中的方法,由于代码比较复杂,无法提供代码,这个大家在遇到具体问题时可以来找我。
经验提供者:
曲艺
在初期构建框架的时候就注意就不会出现此问题了
11.游戏下载安装失败,其原因可能是游戏名称太长,改短点就行了。
经验提供者:
章谦
养成习惯,避免游戏名长度过长
12.NOKIAQD,由缓冲图中得到的Graphics,不能够设置字体颜色,解决办法是,将缓冲图去掉或者是先画完缓冲图再画字。
经验提供者:
章谦
后画字
13.索爱K700C,播声音的时候如果没用Player.realize()和Player.prefetch()而是直接使用splayer.start()可能会导致声音无法正常播放。
经验提供者:
章谦
14.很多机型在挂起并返回后,之前stop的声音,再调用start之后无法继续播放。
原因可能是在showNotify中无法激活声音设备。
解决方案1:
在挂起时不停止音乐,而是设置音乐音量为0,返回之后再设置回来。
经验提供者:
郭金鑫
解决方案2:
可尝试在paint()中进行声音的激活。
经验提供者:
曲艺
解决方案3:
可以先画一个暂停屏幕后触发一个退出暂停屏幕的按键时再放声音。
经验提供者:
申岩
第三种方法比较适用
15.E2执行hidenotify和shownotify,E6不执行。
E2可以直接拿nokia的240*320移植,只要改左右按键即可,三星D508和D808的按键和nokia一样,可以分别拿k700c(D508是176*220)和240*320移植,LGkg90不能播放wav文件,我试过料理鼠王和怒的wav声音文件,他的字体和motE398系列的差不多大小。
经验提供者:
申岩
默默的记下了
16.MOTO机型在setFullScreen()后,getWidth()与getHeight()返回值与屏幕不符,但是如果在paint()方法内部调用getWidth()或者getHeight()的话,则与实际屏幕参数相符。
NOK和SE暂时无此问题。
经验提供者:
申岩
那就在了解机型的前提下,用常量来定义宽高
17.K700C,在有多个按键同时按下时,传入keyPressed中的keyCode的值可能与所按下的任何一个键的键值都不相符,而是映射成了其他的按键,如:
同时按下6和8,此时可能传入9的键值。
经验提供者:
谢雷
18.MOTOV300的字体,下面少1象素,是手机问题。
经验提供者:
谢雷
记住了,V300字体下面少一像素
19.NOKIAN73再使用drawRegion做图片翻转时,原图的透明色在经翻转后会变成黑色,解决方案如下:
将drawRegion用Image.createImage替换。
经验提供者:
谢雷
一般在画的时候都用Image.createImage图片翻转有自己的方法
21.NOKIAN73在使用getRGB时得到的点阵数组会有问题,原图中的透明色被转换成了黑色(可能是黑色),解决办法是,得到点阵数组后,原本应该透明的点的颜色重新设置为0。
经验提供者:
谢雷
将颜色重新设置为0
22.索爱510的机型的因为休眠的时候屏幕会关闭,有可能造成休眠返回后造成白屏。
解决方案1:
在线程的while(true)中或者在repaint()之前进行Display.isShown判断,可以解决部分问题。
经验提供者:
白杰
解决方案2:
在游戏的循环中设置手机背景灯常亮,midp和nokiaApi中均可以设置。
经验提供者:
郭金鑫
在手机屏幕关闭前做判断,以避免此问题
23.LG77对一些mid的格式支持不好,有些mid文件会加载不进去,造成声音创建的异常。
经验提供者:
白杰
换其他音频格式
24.MOTO声音暂停应该写在pauseApp中,如果写在hideNotify中返回时会有破音。
经验提供者:
白杰
记住了,MOTO声音的暂停尽量在pauseApp中写
25.除nokia机型之外其他机型callSerially方法都多多少少会存在一些问题,比如按键响应速度慢,或者屏幕绘制速度慢等等,解决方案将callSerially改成while(true)的形式。
经验提供者:
白杰
26.一些机型对Timer的实现可能存在问题,导致按键响应极其迟钝,解决办法是将Timer改成while(true)的形式。
经验提供者:
曲艺
27.对于MOTOK1和V300机型,创建声音时,如果一次创建几个player时,声音无法正常播放,应当在播放某个声音时单独创建要播放的这个声音,如果此前有其他的声音在播放,应该把正在播放的player清掉。
代码片段如下:
Playerplayer;
publicvoidplaySound(Stringurl){
try{
if(player!
=null){
player.stop();
player.deallocate();
player.close();
player=null;
player=Manager.createPlayer(“”.getClass().getResource().getInputStream(),“audio/midi”);
}
player.realize();
player.prefetch();
player.start();
}catch(Exceptionex){}
}
经验提供者:
潘宇琪
清理掉其他的,运行当前的
29.对rms进行操作时先要openRecordStore,再进行读写,读写完成后要closeRecordStore,如果对于同一个名称的数据库open两次的话会出错,例如:
privatestaticfinalStringSTORE_NAME="GameMark";
privatevoidinitResources()throwsIOException,RecordStoreException{
try{
rs=RecordStore.openRecordStore(STORE_NAME,true);
}catch(RecordStoreExceptionex2){
ex2.printStackTrace();
System.out.print("openwrong");
}
try{
if(rs.getNumRecords()<1){
SetNewRMS();
}else{
try{
ReadRMS();
}catch(Exceptionex4){
ex4.printStackTrace();
}
}
}catch(RecordStoreNotOpenExceptionex3){
ex3.printStackTrace();
}
try{
rs.closeRecordStore();
}catch(RecordStoreNotOpenExceptionex1){
System.out.print(ex1);
}catch(RecordStoreExceptionex1){
ex1.printStackTrace();
}
}
publicvoidReadRMS()throwsException{
rs=RecordStore.openRecordStore(STORE_NAME,true);
ByteArrayInputStreambyteis=newByteArrayInputStream(rs.getRecord
(1));
DataInputStreamdatais=newDataInputStream(byteis);
for(inti=0;i<22;i++){
ID_LevelMark[i]=datais.readInt();
}
Isshowstory=datais.readBoolean();
mobile=datais.readUTF();
PlayerName=datais.readUTF();
LevelNum=datais.readInt();
datais.close();
byteis.close();
rs.closeRecordStore();
}
这里我们可以看到ReadRMS()这个方法是对STORE_NAME这个数据库进行读取,
rs=RecordStore.openRecordStore(STORE_NAME,true);
openRecordStore这个方法用了两次,这样读取时就会出错。
经验提供者:
潘宇琪
尽量避免同一个名称
30.有些游戏会有积分联网的功能,可以查看服务器上的高分榜和上传积分到服务器,有时候会有积分不能上传的情况,造成游戏死机,这可能是网络连接的问题或者是服务器端的设置问题,比如服务器设置为只读。
修改的方法是在网络连接的部分将出现这种情况的解决办法写在catch()里。
例如:
publicvoidget_list(Stringmobile,intpagesize,intpage)
throwsIOException{
Isconnect=true;
repaint();
serviceRepaints();
HttpConnectionhc=null;
DataOutputStreamdos=null;
DataInputStreamdis=null;
try{
try{
if(connectType==0)
hc=(HttpConnection)Connector.open("http:
//"+url+dir,
Connector.READ_WRITE);
else{
hc=(HttpConnection)Connector.open("http:
//10.0.0.172"
+dir,Connector.READ_WRITE,true);
hc.setRequestProperty("X-Online-Host",url);
}
hc.setRequestMethod(HttpConnection.POST);
hc.setRequestProperty("Connection","close");
hc.setRequestProperty("Pragma","no-cache");
hc.setRequestProperty("Content-Type",
"application/octet-stream");
hc.setRequestProperty("Cache-Control","no-cache");
dos=hc.openDataOutputStream();
dos.writeInt
(2);
dos.writeUTF(mobile);
dos.writeInt(pagesize);
dos.writeInt(page);
dis=newDataInputStream(hc.openInputStream());
}catch(Exceptionex){
byte[]array=null;
ByteArrayOutputStreambyteArray=newByteArrayOutputStream();
DataOutputStreamout=newDataOutputStream(byteArray);
out.writeInt(0);
out.writeInt(0);
out.writeInt
(1);
out.writeInt
(1);
out.writeInt(30);
for(inti=0;i<30;i++){
List_ID[i]=0;
List_name[i]="----";
List_mobile[i]="--------";
List_score[i]=0;
}
for(inti=0;i<30;i++){
out.writeInt(0);
out.writeUTF("----");
out.writeUTF("--------");
out.writeInt(0);
}
out.close();
array=byteArray.toByteArray();
dis=newDataInputStream(newByteArrayInputStream(array));
}
scoreInlist=dis.readInt();
placeInlist=dis.readInt();
list_length=dis.readInt();
Page_ID=dis.readInt();
intnum=dis.readInt();
for(inti=0;iList_ID[i]=0;
List_name[i]="----";
List_mobile[i]="--------";
List_score[i]=0;
}
for(inti=0;iList_ID[i]=dis.readInt();
List_name[i]=dis.readUTF();
List_mobile[i]=dis.readUTF();
List_score[i]=dis.readInt();
System.out.println(List_ID[i]+List_name[i]+List_mobile[i]
+List_score[i]);
}
for(inti=0;iif(List_ID[i]==placeInlist){
Page_Cur=i;
if(placeInlist==0||page==0)
Page_Cur=0;
}
if(List_ID[i]==0){
if(i-1>=0)
List_ID[i]=List_ID[i-1]+1;
else{
}
}
}
}catch(Exceptione){
e.printStackTrace();
System.out.println("err"+e.toString());
}finally{
if(dis!
=null){
dis.close();
}
if(dos!
=null){
dos.close();
}
if(hc!
=null){
hc.close();
}
}
Isconnect=false;
}
经验提供者:
潘宇琪
在catch里做处理,避免死机
31.moto系列当遇到文件形式创建图片的时候可以适当的把图片从文件中解析出来来创建并且之后System.gc()可以有效的缓解因为图片造成内存紧缺的状况,K700出现过游戏过程中图片加载不进去IO异常(原因不明..),可以在不暴内存的情况下在开始时期加载相关的图片来解决问题。
经验提供者:
白杰
适当的对不同性能的手机型号做更好的内存管理
32.MOTOK1使用GameCanvas时,重绘屏幕的方法如果是flashGraphics的话,command部分不会自动更新(在addCommand之后不更新,需按左右软键才能更新),把flushGraphics改成repaint()即可解决此问题。
经验提供者:
郭金鑫
直接用repaint()方法
33.MOTOK1font.getHeight返回中文字体高度与实际高度不符合,比实际字体高度要小,可能是返回的英文字高度,游戏运行时可能会产生文字重叠现象。
解决办法将font.getHeight替换成常量18。
经验提供者:
章谦
了解机型参数,直接用常量,MOTOK1
34.SEK500C最大下载尺寸为300K,多一点也不可。
经验提供者:
白杰
索爱K500C游戏不要超过300K大小
35.NOK3230来电时不调用pauseApp。
经验提供者:
章谦
手动调用
36.NOK3230来电后程序会继续运行,即由MIDlet应用程序进程所管理的线程并没有被挂起。
自己手动挂起