j2me遊戲引擎程式結構

來源:互聯網
上載者:User
程式 遊戲引擎的結構很多,不過基本上都是在一個遊戲主迴圈內實現。程式裡面的主迴圈包含了程式架構的最主要的結構體。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);

}



}



其中關於控制主迴圈速度的代碼可以不要,但是lib.sleep(30)必須保留,因為在Nokia 60的手機上,如果去除了sleep(30),那麼遊戲將無法切換回來。同時,在遊戲中任何一個內部迴圈中,也必須加入sleep(30)這個等待,才能讓遊戲可以切換回來,至於為什麼這樣做,我暫時還不清楚。30ms是我測試過沒有問題的數值,可能比30ms還小的值也是沒有問題的。



同時,在MOTO的手機上,必須將遊戲的主迴圈放在一個線程中,遊戲才能切換回來,不過可以不加上面說的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;

}



}





相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。