// 物理鍵碼 -> 邏輯游戲動作 (一對多)
public static int getGameAction(int keyCode)
// 邏輯游戲動作 -> 物理鍵碼 (一對一,有缺陷)
public static int getKeyCode(int gameAction)
| 維度 | getGameAction(keyCode) | getKeyCode(gameAction) |
|---|---|---|
| 映射方向 | 物理鍵碼 → 邏輯動作 (UP/DOWN/LEFT/RIGHT/FIRE...) | 邏輯動作 → 物理鍵碼 |
| 映射關係 | 一對多:多個物理鍵可映射同一邏輯動作 | 一對一:只返回一個物理鍵碼 |
| 準確性 | ✅ 完全準確,符合 MIDP 規範 | ❌ 缺陷:忽略多鍵映射,返回值依賴實現 |
| 推薦程度 | ✅ 強烈推薦 | ❌ 不推薦使用 |
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();
}
// ✅ 正確:直接在事件回調中轉換
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;
}
}
getGameAction(keyCode) 在 keyPressed/Released/Repeated 中處理邏輯,設備無關、兼容多鍵映射。getKeyCode(gameAction),除非極特殊場景 (如顯示按鍵提示圖標) 且接受其局限性。getKeyStates(),則完全不依賴這兩個方法,直接判斷位掩碼。「應用程序應避免使用 getKeyCode(int gameAction),而應始終使用 getGameAction(int keyCode)。這是處理事件的設備無關方法。」