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;
}
}
部分程式碼轉貼.....