首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 專業手機遊戲開發基礎(一):遊戲迴圈、幀鎖定與鍵盤緩衝核心架構

     編輯:J2ME

遊戲基本結構:時間驅動模型

專業遊戲採用時間驅動,而非事件驅動。無論有無輸入,遊戲持續循環:檢查輸入 → 運行邏輯 → 渲染畫面。核心結構:

  1. 初始化遊戲
  2. 是否結束?(是 → 清理結束)
  3. 蒐集玩家輸入
  4. 運行遊戲邏輯
  5. 更新並顯示下一幀
  6. 回到步驟 2

遊戲迴圈實現:Canvas 實作 Runnable

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 補足。
  • FPS 計算:累計幀數 × 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 判斷本幀新按下。此為最簡單單次緩衝,專業開發需擴展支援連擊、組合鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved