專業遊戲採用時間驅動,而非事件驅動。無論有無輸入,遊戲持續循環:檢查輸入 → 運行邏輯 → 渲染畫面。核心結構:
public void run() {
exitMidlet = false;
long startTime = 0, timeCount = 0;
gameInit();
int curKey = 0;
while (!exitMidlet) {
startTime = System.currentTimeMillis();
acquireKey(); // 鍵盤緩衝
gameLoop(); // 邏輯與圖形處理
repaint(); // 觸發渲染
serviceRepaints(); // 強制刷新
frameCount++;
// 鎖定 FPS
timeCount = MIN_DELAY - (System.currentTimeMillis() - startTime);
timeCount = (timeCount < 1) ? 1 : timeCount;
try { Thread.sleep(timeCount); } catch (InterruptedException ex) {}
}
endMidlet();
}
MIN_DELAY=50 → 最大 20 FPS。若幀耗時不足則 sleep 補足。累計幀數 × 1000 / 累計耗時(平均 FPS)。將按鍵狀態儲存於 int 位元中(32 位足夠),三個 int 變數:
key:當前按下狀態pressedKey:本幀新按下releasedKey:本幀釋放常數定義:GKEY_0 = 1<<0、GKEY_1 = 1<<1…
public void keyPressed(int keyCode) {
int value = getKeyValue(keyCode);
key |= value;
pressedKey |= value;
}
public void keyReleased(int keyCode) {
int value = getKeyValue(keyCode);
key ^= value; // 異或清除位
releasedKey |= value;
}
private static void acquireKey() {
frameKey = key;
framePressedKey = pressedKey;
frameReleasedKey = releasedKey;
pressedKey = 0;
releasedKey = 0;
}
public static boolean keyHold(int gameKey) { return (frameKey & gameKey) != 0; }
public static boolean keyDown(int gameKey) { return (framePressedKey & gameKey) != 0; }
public static boolean keyUp(int gameKey) { return (frameReleasedKey & gameKey) != 0; }
keyHold 判斷長按(至少從上一幀持續),keyDown 判斷本幀新按下。此為最簡單單次緩衝,專業開發需擴展支援連擊、組合鍵。