程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 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();
}
初始化就不會報錯拉!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved