J2me開發大致框架

javaprogramers發表於2005-03-25
   
    J2me開發名目繁多.但大致框架還算有規律可尋,我根據開發經驗給大家提點意見,做下總

結:遊戲的結構很多,不過基本上都是在一個遊戲主迴圈內實現。程式裡面的主迴圈包含了程

序框架的最主要的結構體。J2me的程式一般都包含兩個class檔案,一個是MIDlet,一個是

Displayable。一般我都是把遊戲的主要程式碼放在Displayable這個類裡面。這個類是基於事件

驅動的程式,有三個主要相應函式void paint(Graphics g),void keyPressed(int keyCode),

void keyReleased(int keyCode)。

1.使用Runnable和建立執行緒的主迴圈

一般主體的做法就是讓Displayable這個類實現Runnable這個介面,然後在其建構函式中建立

一個執行緒,啟動其run()函式,而run函式裡面就包含了遊戲的主迴圈。

隨便找了段典型程式碼大家參照下語法吧:

public class GameMIDlet extends MIDlet {

  static GameMIDlet instance;

  Display display;

  GameDisplayable displayable = null;

 public GameMIDlet() {

    instance = this;

    display =  Display.getDisplay(this);

    displayable = new GameDisplayable();

  }

public void startApp() {

    display.setCurrent(displayable);

  }

public void pauseApp() {

  }
public void destroyApp(boolean unconditional) {

    displayable.running = false;

  }
public static void quitApp() {

    instance.destroyApp(true);

    instance.notifyDestroyed();

    instance = null;

  }

}
public class GameDisplayable extends FullCanvas implements Runnable 
{

  /** 主控制執行緒 */

  Thread MainThread = null;

  /** 遊戲時鐘間隔 毫秒為單位 */

  public static long timeinterval = 20;

  public static boolean Isstable = true;

  /* 用於遊戲時鐘的變數 */

  public static long timeold = 0;

  public static long timenow = 0;

  public long interval = 0;

  public static long frames_per_second = 0;

  int count = 0;

  long second = 0;

  public static boolean running = true;

public GameDisplayable() {

      // 開始主執行緒

    Thread MainThread = new Thread(this);

    MainThread.start();

  }
public void run() {

    while (running) {

      timenow = System.currentTimeMillis();

      interval = timenow - timeold;

      if (interval >= timeinterval) {

        timeold = timenow;

        Game_Process();

        if (second != (System.currentTimeMillis() / 1000)) {

          second = System.currentTimeMillis() / 1000;

          frames_per_second = count;

          count = 1;

       }
      else

          count++;
      }

      lib.sleep(30);

    }
}


2.不使用執行緒的主迴圈辦法

這個辦法只能在Nokia的平臺上實現,而我只建議在Nokia 40的平臺上做,這樣不需要執行緒,

道理上來說節約了一些記憶體,如果不是記憶體很緊張的機型,那麼最好還是使用上一種辦法。

遊戲的主迴圈放在MIDlet的class裡面,具體做法如下:

 public class GameMIDlet extends MIDlet {

 GameDisplayable displayable = null;

 /** 遊戲時鐘間隔 毫秒為單位 */

  public static long  timeinterval = 0;

  //用於遊戲時鐘的變數

  public static long timeold = 0;

  public static long timenow = 0;

  public long interval = 0;

  public static long frames_per_second=0;

  int count=0;

  long second =0;

  public static boolean running = false;

  static boolean exitApp =false;

  public GameMIDlet() {

    displayable = new GameDisplayable();

    running =true;

  }
 public void startApp() {

    running =true;

    Display.getDisplay(this).setCurrent(displayable);

    while(running) {

      timenow = System.currentTimeMillis();

      interval = timenow - timeold;

      if (interval >= timeinterval) {

        timeold = timenow;

        displayable.Game_Process();

        if(second != (System.currentTimeMillis() /1000)){

            second = System.currentTimeMillis()/1000;

            frames_per_second = count;

            count = 1;

          }else

            count ++;

      }

    }

    if(exitApp) {

      destroyApp(true);

      notifyDestroyed();

    }
  }
  public void pauseApp() {

    running =false;

  }
  public void destroyApp(boolean unconditional) {

    running = false;

  }
  public static void quitApp() {

    running =false;

    exitApp =true;

  }
}

部分程式碼轉貼.....

相關文章