J2ME 低級 UI (Canvas) 直接獲取鍵盤 keyCode,但不同手機廠商、型號的功能鍵 keyCode 差異極大,導致嚴重移植性問題。本文分析鍵盤區域差異、getGameAction() 統一映射機制、Nokia 專用擴展及遊戲開發最佳實踐。
| 區域 | 包含鍵 | keyCode 一致性 | 移植性風險 |
|---|---|---|---|
| 功能鍵區 | 左右軟鍵、導航鍵 (上下左右/確定)、接聽/掛機鍵 | **極低** (廠商自定義) | 極高,直接用 keyCode 判斷必失敗 |
| 數字鍵區 | 0-9、*、# | **高** (ITU-T 標準) | 低,keyCode 相對固定 |
高級 UI (Form/List + Command) 僅用功能鍵映射固定 Command,**無移植性問題**,但靈活性受限。
將具體 keyCode 映射為標準遊戲動作常量,**屏蔽硬件差異**:
int action = getGameAction(keyCode); // 在 keyPressed/Released/Repeated 中調用
| GameAction 常量 | 對應物理鍵 (典型) | 語義 |
|---|---|---|
Canvas.UP | 數字鍵 2、導航鍵 ↑ | 向上移動 |
Canvas.DOWN | 數字鍵 8、導航鍵 ↓ | 向下移動 |
Canvas.LEFT | 數字鍵 4、導航鍵 ← | 向左移動 |
Canvas.RIGHT | 數字鍵 6、導航鍵 → | 向右移動 |
Canvas.FIRE | 數字鍵 5、導航鍵確定 (中鍵) | 確認/射擊/主要動作 |
Canvas.GAME_A | 數字鍵 1 或 7 | 輔助動作 A |
Canvas.GAME_B | 數字鍵 3 或 9 | 輔助動作 B |
Canvas.GAME_C | 數字鍵 7 或 * | 輔助動作 C |
Canvas.GAME_D | 數字鍵 9 或 # | 輔助動作 D |
GAME_A~D 具體映射 1/3/7/9 或 7/9/*/# 取決於手機佈局,**但語義固定為輔助鍵 1~4**,遊戲邏輯只需處理 GAME_A~D 即可跨機型運行。
public class GameCanvas extends Canvas {
protected void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch (action) {
case Canvas.UP: moveUp(); break;
case Canvas.DOWN: moveDown(); break;
case Canvas.LEFT: moveLeft(); break;
case Canvas.RIGHT: moveRight(); break;
case Canvas.FIRE: fire(); break;
case Canvas.GAME_A: specialA(); break;
case Canvas.GAME_B: specialB(); break;
case Canvas.GAME_C: specialC(); break;
case Canvas.GAME_D: specialD(); break;
}
repaint();
}
// 遊戲邏輯方法...
}
針對 Nokia 系列 (S40/S60 早期機型) 提供軟鍵標準化:
FullCanvas.SOFTKEY1 — 左軟鍵FullCanvas.SOFTKEY2 — 右軟鍵import com.nokia.mid.ui.FullCanvas;
public class NokiaGameCanvas extends FullCanvas {
protected void keyPressed(int keyCode) {
if (keyCode == SOFTKEY1) showMenu();
else if (keyCode == SOFTKEY2) pauseGame();
else {
int action = getGameAction(keyCode);
// 標準遊戲動作處理...
}
}
}
僅在 Nokia 設備上可用,發布時需打包 Nokia UI API 庫 (nokia-ui.jar),非 Nokia 設備會NoClassDefFoundError,建議反射加載或分版本發布。
| 維度 | 高級 UI (Form/List + Command) | 低級 UI (Canvas + keyCode/GameAction) |
|---|---|---|
| 移植性 | 極佳 (Command 映射固定) | 需用 GameAction 保證 |
| 靈活性 | 低 (標準佈局) | 極高 (自定義渲染/邏輯) |
| 適用場景 | 表單、列表、選單、簡單交互 | 遊戲、繪圖、實時動畫、自定義控件 |
| 性能 | 一般 | 可優化到極致 |
keyCode (除非針對單一機型)。UP/DOWN/LEFT/RIGHT/FIRE,輔助鍵映射到 GAME_A~D。FullCanvas.SOFTKEY1/2 處理軟鍵,配合反射實現多版本兼容。keyCode → GameAction 映射 (極少數異形鍵盤)。