模拟器与真机的程序差别J2ME

本文总结了J2ME开发过程中遇到的各种平台差异性问题及解决方案,包括文字显示、字符串处理、数学运算等方面的经验分享。

模拟器与真机的程序差别

1。  S60机器上文字需要设置如
public static final Font smallFont    =
Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);

在需要写文字时候
g.setColor(0xFFFFFF);
g.setFont(smallFont);
g.drawString(“需要写的文字”,0,0, g.TOP|g.HCENTER);
如果不设置字体颜色,他会自己默认一个颜色是上次设置的,字体是系统默认的(大字体)。

在QB上不需要每次写文字时候都设置文字字体,直接
g.drawString(“需要写的文字”,0,0, g.TOP|g.HCENTER);
它的字体是上次设置的字体。(如果程序中都使用的是小字体只需要设置一次字体即可。)

2。  模拟器中支持
String str ="字符串";
str=str.intern();    //将字符对象串转化成字符串
if( str == "字符串" )   //可以返回真

真机上是不支持该方法只能用
if( str.equals("字符串") )   //才能返回真
如果也用上面的方法 得不到想要的结果的。

3   .j2me没有浮点数
Role.MONEY *= 9/10;
结果Role.MONEY=0;
只能
Role.MONEY = Role.MONEY*9/10;

4.imgRens    = Image.createImage("/pics/state.png");        //人物状态
imgState    = new Image[4];
imgWidth= 10;
for( int i=0; i<imgState.length; i++ )
{
//    imgState    = Image.createImage( imgWidth, imgRens.getHeight() );
   imgState    = DirectUtils.createImage( imgWidth, imgRens.getHeight(), 0x00000000 );
   gren        = imgState.getGraphics();
   gren.drawImage(imgRens, -imgWidth*i, 0, Graphics.TOP|Graphics.LEFT);
}
gren   =null;
imgRens=null;
System.gc();
 模拟器用DirectUtils建的图片时候运行出问题,不过真机上没问题。可以生成JAR使用!

5.public void run()
{
try
{
while( true )
{
//    if( isStopGame ) continue;            //如果暂停游戏
updatas++;
switch (State)
{
case S_GAME_MAP:if( isStopGame ) break;    if(gamemap!=null)gamemap.updata(updatas);    break;
case STATE_MBOX:    setState(S_COVER);    break;    //切换到游戏状态
case STATE_LOAD_CMCC:    State=STATE_CMCC;    break;    
case STATE_CMCC:    State=STATE_MBOX;    break;    //切换到第二屏
}
this.repaint();        //有需要时才重新绘制
Thread.sleep(sleepTime);
}
}    catch (Exception ex){}
}


如果使用注释掉的代码暂停游戏60会死机.v300.k700不会死掉.所以在60上只好用注释下面的那个暂停了!

6.关于随机数对0求余的问题
iRand() % 0;
一个正整数对0求余会抛出java/lang/ArithmeticException这个错误
不过 一些机器上(S60.K700.V300)还是会强制iRand() % 0=0的(但是会卡一下)
但是 S40报错之后无法继续运行。
所以 S40上不要出现对0求余运算!

7.int a=1000000000;
int b=1000000000;
int c=a*b;
System.out.println("c="+c);
这样写编译器允许,不过结果是错误的C的值已经超过INT的范围了,他会自动截取INT的32为,其他位为益出。
byte a=100;
byte b=100;
byte c=a+b;
这样写 编译器不允许,必须byte c=(byte)(a+b);才能通过。

8.8。偶尔在程序中用到了浮点数,部分模拟器,真机通过了!

(int)( ax*Math.sin(dx/10)/precision );
正弦曲线使用Math.sin( dx/10 ),dx/10为Double类型,输入参数为Double,也就是弧度,返回也是Double,即对应弧度的正弦值,经测试 Math.sin( Math.PI/2 ) 返回1, Math.sin( Math.PI )返回0,
Nokia s60模拟器通过测试,可以使用。
Nokia 6230i 和 Sony Ericsson k700 真机通过测试,可以使用!
其他机型 估计新出的能通过,Nokia S60系列机器不能使用,如3230,6670等。
相信 J2ME支持浮点运算只是个时间问题!

9。方法体大小是有限制的!
不可以超过65535个字符!
    通常不会有这么多个字符,但是在写一些地图数组的时候方法体就可能很大,如果出现IDE报错,那么你就应该考虑是不是方法体过大了!结果办法就是 把地图数组写成资源文件,在程序中调入,解析,在使用!
/*
* 生成 地图数文件Created on 2005-10-13
*/
import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class mapData
{
   byte[][] mapData =   //某一地图 图片数组
   {
   
   };
   
   int        dataBH        = 6;                    //0//地图编号        (地下城2.3.4.5)
   int        dataYs        = 3;                    //1//元素图片编号    
   int    dataHs        = mapData.length;        //2//行数
   int    dataLs        = mapData[0].length;    //3//列数
   int    dataPz        = 41;                    //4//碰撞点
   
   String    fileName    = "map"+dataBH+".gl";    // //文件名
   DataOutputStream out= null;
   
   public static void main(String[] args)
   {
       mapData a = new mapData();
       try
       {
           a.out = new DataOutputStream( new FileOutputStream( a.fileName ) );
       }    catch(Exception e)    {}
       a.writeByteArray();
   }

   public void writeByteArray()
   {
       try
       {
           out.writeByte( dataBH );    //地图编号        0
           out.writeByte( dataYs );    //地图元素编号    1
           out.writeByte( dataHs );    //行数            2
           out.writeByte( dataLs );    //列数            3
           out.writeByte( dataPz );    //碰撞点        4    

           for( int i=0; i<mapData.length; i++ )
           {
               for( int j=0; j<mapData[0].length; j++ )
                   out.writeByte( mapData[j] );
           }
       } catch(Exception e){}
   }
}
这个J2SE程序可以生成一个MAP1.GL的文件,文件中的数都是BYTE类型的 。

/----------------------------j2me中的地图类----------------------------------------------------------------/
   /*读文件*/
   public byte[] readFile(String filename)
   {
      byte[] data = null;
      try
      {
        InputStream in = this.getClass().getResourceAsStream(filename);
        in.read( dataIndex, 0, 5 );
        data = new byte[ dataIndex[2]*dataIndex[3] ];
        in.skip( 0 );
        in.read( data );
        in.close();
      }
      catch(Exception e){e.printStackTrace();}
      return data;
   }
   /*解吸文件*/
  public byte[][] readMapData( String filename )
  {
     int k=0;
     byte[] data = readFile(filename);
     byte[][] map = new byte[ dataIndex[2] ][ dataIndex[3] ];
     
    for( int i=0; i<dataIndex[2]; i++ )
       {
           for( int j=0; j<dataIndex[3]; j++ )
           {
               map[j] = data[k];
//                System.out.print(data[k]+"," );
               k++;
           }
//            System.out.println("" );
       }
    return map;
  }


在 构造函数中
byte[][]   map = readMapData("/res/map"+this.mapNum+".gl");//读文件/解吸/地图数组
就可以得到地图数组
地图信息已经写到
byte[] dataIndex 中了,需要添加其他信息可以更改 dataIndex 的大小

10.字符串连接 与 ?: 判断符号 优先级
String str0 = "abd";
String str1 = "123" + str0==null ? "null" : str0 ;
表达试中 ? : 的优先级没有 + 的高
所以 计算结果等于
String str1 = ("123" + str0) ==null ? "null" : str0 ;

所以 要的到 str0不等于NULL的结果
可以
String str1 = "123" + (str0==null ? "null" : str0 );

11.当定义一个对象数组出现没有初始化错误时候:
int typeSum = 10;
JTextField[] jTextField1 = null;
jTextField1     = new JTextField[typeSum];
这样并未初始化 jTextField1[0]..jTextField1[9]等对象!
这就要看JTextField类的构造函数了
public class JTextField extends JTextComponent
这个类JTextField也是继承来的
构造函数:
  public JTextField() {
    this(null, null, 0);
  }

  public JTextField(String text) {
    this(null, text, 0);
  }

  public JTextField(int columns) {
    this(null, null, columns);
  }

  public JTextField(String text, int columns) {
    this(null, text, columns);
  }

  public JTextField(Document doc, String text, int columns) {
  ...
  }
等等..
jTextField1     = new JTextField[typeSum];
这句话调用的是
  public JTextField() {
    this(null, null, 0);
  }
这个构造函数
所以没有正确初始化 jTextField1这个数组
可以在使用前
for( int i=0; i<typeSum; i++)
{
jTextField1 = new JTextField();
}
初始化就不会报错拉!

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值