我們在J2ME中繼承Canvas類的時候一般會再實現Runnable接口,實現多線程的效果個人認為實際上這邊的線程不過是起到一個定時器的作用,完全可以用一個Timer或者用一個Inner class來實現這個的功能,在這裡不對這個做過多的討論。
我們的run()這個函數一般是實現這樣的功能,定時的處理游戲邏輯gameLogic()和重畫屏幕paint()。注意這裡的定時是本文的重點,如果執行游戲邏輯和重畫屏幕的間隔時間不為固定的話。一定破壞游戲性和游戲畫面的真實性。
好了,我們看看一般的處理方法()
public void run() {
while (true) {
gameLogic();//處理游戲邏輯
repaint();//調用paint()重畫屏幕
Thread.sleep(500);//線程sleep0.5秒
}
}
看上去好象是每次的間隔就是0.5秒。不過有沒有想過如果一個復雜邏輯的游戲gameLogic(),和paint()實際上也是需要不少時間來處理的,而且對於一個復雜邏輯的游戲來說每次處理的時間長度都不相同,可能第一次gameLogic()+paint()的時間是0.1秒下一次又有可能是0.01秒。這樣不就造成了間隔時間的不固定嗎。所以我們必須把gameLogic(),和paint()的運算時間計算進去,就象下面那樣。
public void run() {
time0 = System.currentTimeMillis();
while (true) {
time1 = System.currentTimeMillis();
timePassed = time1 - time0;
time0 = time1;
gameLogic();//處理游戲邏輯
repaint();
time1 = System.currentTimeMillis();
if (time1 - time0 < RUN_RATE) {
try {
Thread.sleep(RUN_RATE - (time1 - time0));
}
catch (InterruptedException e) {
}
}
}
}