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

getKeyCode vs getGameAction:J2ME 按鍵映射核心差異與最佳實踐

     編輯:J2ME

兩個方法簽名

// 物理鍵碼 -> 邏輯游戲動作 (一對多)
public static int getGameAction(int keyCode)

// 邏輯游戲動作 -> 物理鍵碼 (一對一,有缺陷)
public static int getKeyCode(int gameAction)

核心差異對比

維度getGameAction(keyCode)getKeyCode(gameAction)
映射方向 物理鍵碼 → 邏輯動作 (UP/DOWN/LEFT/RIGHT/FIRE...) 邏輯動作 → 物理鍵碼
映射關係 一對多:多個物理鍵可映射同一邏輯動作 一對一:只返回一個物理鍵碼
準確性 ✅ 完全準確,符合 MIDP 規範 ❌ 缺陷:忽略多鍵映射,返回值依賴實現
推薦程度 ✅ 強烈推薦 ❌ 不推薦使用

實例:Nokia 7650 多鍵映射場景

  • 物理鍵:方向鍵 Up、數字鍵 2、搖桿 Up 均映射為邏輯動作 Canvas.UP。
  • getGameAction(KEY_UP) → Canvas.UP ✅
  • getGameAction(KEY_NUM2) → Canvas.UP ✅
  • getGameAction(KEY_JOYSTICK_UP) → Canvas.UP ✅
  • getKeyCode(Canvas.UP) → 只返回三者之一 (如搖桿碼),導致方向鍵/數字鍵 2 無法觸發邏輯 ❌

反面教材:錯誤用法

// ❌ 錯誤:初始化緩存鍵碼,後續 keyPressed 中比較
int leftKey = getKeyCode(Canvas.LEFT);  // 只得到一個鍵碼
int rightKey = getKeyCode(Canvas.RIGHT);

public void keyPressed(int keyCode) {
    if (keyCode == leftKey) moveLeft();  // 遺漏了其他映射到 LEFT 的鍵!
    else if (keyCode == rightKey) moveRight();
}

正確模式:事件驅動 + getGameAction

// ✅ 正確:直接在事件回調中轉換
public void keyPressed(int keyCode) {
    int action = getGameAction(keyCode); // 物理鍵碼 -> 邏輯動作
    switch (action) {
        case Canvas.LEFT:  moveLeft();  break;
        case Canvas.RIGHT: moveRight(); break;
        case Canvas.UP:    moveUp();    break;
        case Canvas.DOWN:  moveDown();  break;
        case Canvas.FIRE:  fire();      break;
    }
}

設計原則總結

  1. 永遠使用 getGameAction(keyCode) 在 keyPressed/Released/Repeated 中處理邏輯,設備無關、兼容多鍵映射。
  2. 避免使用 getKeyCode(gameAction),除非極特殊場景 (如顯示按鍵提示圖標) 且接受其局限性。
  3. 游戲主循環若用輪詢 getKeyStates(),則完全不依賴這兩個方法,直接判斷位掩碼。

MIDP 規範原文引用

「應用程序應避免使用 getKeyCode(int gameAction),而應始終使用 getGameAction(int keyCode)。這是處理事件的設備無關方法。」

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