J2ME Game开发笔记(第三辑)

文章来源:J2ME开发网

Nokia系统bug两则

1 Nokia7650(V4.46)应用程序目录显示bug

  应用程序安装后,打开应用程序目录,显示错误提示:
  "程序已关闭 MidpUi USER9",应用程序目录无法进入。

  分析后发现,原来是新安装的应用程序没有在mainfest.mf中的

midlet-1属性中指定应用程序图标,导致程序目录无法显示图标。
  在我所见到NokiaS40机器上和NGageQD上,如果图标没指定或指定了但

不存在,将显示默认的图标。
  此bug对于其它版本的7650或者其他机型是否存在尚不得知。

解决方法:使用seleQ将7650c:/system/midp中刚安装的程序目录删掉,即可正常进入应用程序目录。

在应用中使用自己的应用程序图标,并正确设置,以避免让用户遭遇到此bug。

2 Nokia3100(v3.10)游戏目录振动设置与应用程序中使用振动冲突的bug
  在Nokia3100等机型中,提供了一个游戏目录管理游戏类应用。该目录

可以设置目录中的游戏运行时是否发声,振动和使用网络。对于

Nokia3100(V3.10)如果将振动设置关掉,而在应用程序中使用了振动,则

会产生一个异常。此bug是在10个月之前发现的,记不清是哪个异常了。
  此bug对于其它版本的3100或者其他机型是否存在尚不得知。

解决方法:在应用程序中使用振动的地方增加异常处理。

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

同时多处异常<script language="javascript" type="text/javascript"> document.title="同时多处异常 - "+document.title </script>

程序出现exception时,在一个外包函数处捕获到了,显示为函数a出现异常,然后去a中捕获却没捕获成功,但是仍然发生了异常.

原来是外包函数中调用的另一个函数b也产生了同样的异常.

同时多处异常-小心!

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

Eclipse Tips<script language="javascript" type="text/javascript"> document.title="Eclipse Tips - "+document.title </script>
1.在工具条上有个文本形象的按钮"show source of selected element only".当编辑类的某个成员(方法或域)时,按下这个按钮,则当前窗口会只显示你正在编辑的类成员.再按一下则恢复.
2.显示java文件行号.菜单中选择Window->Preferences打开Preferences窗口后选择Java->Editor,在右边的选项中选中Show line numbers.
显示非java文件行号.在Preferences窗口中选择Workbench->Editors->Text Editor,同样右边的选项中选中Show line numbers.
3.编辑代码时,按ctrl+/可以注释当前行或选中的多行代码;按Atrl+/可以显示自动完成代码的提示。
4.选中代码,按 ctrl+shift+F 格式化代码
5.输入syso,按atrl+/可出来 System.out.println("") ;
 
-----------------------------------
 
NokiaS60 UI API bug<script language="javascript" type="text/javascript"> document.title="NokiaS60 UI API bug - "+document.title </script>

1 旋转后,并以clip的方式向缓冲上贴图,clip无效

2 无法创建透明muttable Image

此两点,致命伤,带来许多不变

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

J2ME中使用随机数<script language="javascript" type="text/javascript"> document.title="J2ME中使用随机数 - "+document.title </script>

产生0~n之间的随机数

(ran.nextInt()>>>1)%n

(ran.nextInt()&0x7FFFFFFF)%n

产生-n~0之间的随机数

(ran.nextInt() | 0x80000000 )%n

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

NokiaS60模拟器异常退出<script language="javascript" type="text/javascript"> document.title="NokiaS60模拟器异常退出 - "+document.title </script>

症状:模拟器自动关闭,没提示任何错误

原因:使用了Nokia UI API中的灯光或振动控制,而Nokia S60部分机型和对应的模拟器不支持这两个特性.

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

检测机型,总是有点用处的

在J2ME开发中,往往遇到根据不同机型做不同事情的情况,比如Nokia3650的键盘比较特殊,Nokia7650不支持mmapi,所以需要获得机型信息。

下面是一段简单的代码
public static void checkPlatform()
{
     String platform = System.getProperty("microedition.platform") ;                
        String tmp = null ;
        if(platform.length()==9)
            tmp = platform ;
        else if(platform.length()>9){
            tmp = platform.substring(0,9) ;
        }
        if(tmp!=null){
         if(tmp.equals("Nokia3650")){
             is3650 = true ;
         }
         else if(tmp.equals("Nokia7650")){
             is7650 = true ;
         }
        }
}
获得机型信息还包括版本号等等,所以要截取前面的几个字符比较。
不过得到的机型字符串有时并不保险,如早期的Nokia N-Gage获得得并不是N-Gage,不过3650和7650还是可以的

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

J2ME中查表法使用三角函数<script language="javascript" type="text/javascript"> document.title="J2ME中查表法使用三角函数 - "+document.title </script>

CLDC和MIDP都没有提供三角函数,而且CLDC1.0中也没有浮点数,所以我们的选择是查表。使用8位定点数的sin和cos表。下面是wtk自带demo中的代码,只提供了有限的几个角度,实际使用时根据需要细化角度值。

// sines of angles 0, 10, 20, 30, 40, 50, 60, 70, 80, 90,    all *256
    private static final int[] SINES =
        { 0, 44, 88, 128, 165, 196, 222, 241, 252, 256 };


    // angle is in degrees/10, i.e. 0..36 for full circle
    private static int sineTimes256(int angle)
    {
        angle %= 36;    // 360 degrees
        if (angle <= 9)          // 0..90 degrees
        {
            return SINES[angle];
        }
        else if (angle <= 18)    // 90..180 degrees
        {
            return SINES[18-angle];
        }
        else if (angle <= 27)    // 180..270 degrees
        {
            return -SINES[angle-18];
        }
        else                     // 270..360 degrees
        {
            return -SINES[36-angle];
        }
    }


    // angle is in degrees/10, i.e. 0..36 for full circle
    private static int cosineTimes256(int angle)
    {
        return sineTimes256(angle + 9);     // i.e. add 90 degrees
    }

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

Nokia S60 IO操作内存泄漏不可不察<script language="javascript" type="text/javascript"> document.title="Nokia S60 IO操作内存泄漏不可不察 - "+document.title </script>

Nokia7650,3650
游戏运行过程中,有时会出现“存储已满”的对话框,出现的位置不固定
游戏运行过程中,有时出现“应用程序错误  NullPointerExcept”,“程序已关闭  MidpUi”的对话框
游戏运行过程中,有时会出现“程序已关闭   MidpUi   ViewSrv   9”的对话框,出现的位置不固定

其实这个问题是由S60的getResourceAsStream方法内存泄漏的bug引起的,由于每次切换地图时io操作都要读取大量数据,内存泄漏积累到一定程度就引起了“存储已满”,白屏,死机,进而会引起null pointer异常等。解决方法是尽量减少io操作的次数。如果内存够大就一次将资源读入。

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

初次使用JBuilder 7-若干小问题

1 MobileSet问题
 JBuilder7需另外安装MobileSet, Mobileset自带了一个WTK. 如果不安装MobileSet,JB7配置JDK时不能自动识别WTK,安装MobileSet后,可以通过配置JDK的方法加入新的WTK

2 资源文件问题
 JBuilder的所有源文件都应该放在source path中,可以在工程属性中设置source path,资源文件也一样。既可以和源文件放在一个source path(即文件夹)中,也可以放在另外的source path中。需要注意的是,JBuilder只默认识别一定数量的后缀,如png,如果你使用了其他后缀的资源文件,如dat,bin,需要先把该文件通过add files加入到工程中,选择文件属性,设置为copy,这样该后缀的文件就被识别为资源文件了。

3 光标不对问题
 最简单的办法-改字体,我改成了第一种字体(JB7中),感觉和默认字体没什么不同。至于这个问题的根本解决方法网上有文论述。

4 鼠标滚轮无效问题
 据说这个问题只在JB7和以下版本中存在,原因是只有J2SDK1.4以上才支持滚轮,所以需要将JB7的JDK改成1.4的. 方法是修改JBuilder7/bin/jdk.config文件,将javapath和addpath两行修改,例如:
# javapath ../jdk1.3.1/jre/bin/hotspot/jvm.dll
javapath Y:/j2sdk1.4.2/jre/bin/server/jvm.dll
# addpath ../jdk1.3.1/lib/tools.jar
addpath Y:/j2sdk1.4.2/lib/tools.jar

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

运行Nokia模拟器的一个注意事项<script language="javascript" type="text/javascript"> document.title="运行Nokia模拟器的一个注意事项 - "+document.title </script>

        这是一个老问题了,原来用WTK的时候就有,在WTK中启动Nokia的模拟器,如果先前已经打了包,那么运行的是打包的程序,想当年经常会很郁闷为什么改动了没效果,后来养成一个习惯,将jar装到手机测试后随手删除。
        今天用JBuilder的时候又碰到了这个问题,也是Nokia的模拟器,如果已经建立了一个archive,那么Nokia模拟器运行的总是包,呵呵,所以要么将archive从project中remove,要么每次都rebuilder这个archive。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值