鍵盤輸入是 J2ME 互動核心。高階 UI 與低階 UI 處理機制截然不同,本文詳細對比兩者差異,並提供跨裝置按鍵碼移植的標準解法 getGameAction()。
Displayable.addCommand(Command) 自動對應裝置軟鍵Command.BACK/CANCEL,右鍵 Command.OK/SCREENkeyCode| 區域 | 按鍵 | 典型 keyCode | 移植問題 |
|---|---|---|---|
| 功能鍵區 | 左軟鍵 | Nokia:-6, Moto:-21, SE:-7 | 各廠商完全不同,最大移植痛點 |
| 右軟鍵 | Nokia:-7, Moto:-22, SE:-6 | ||
| 方向上 | -1 / Canvas.UP | ||
| 方向下 | -2 / Canvas.DOWN | ||
| 確定/選擇 | -5 / Canvas.FIRE | ||
| 數字鍵區 | 0~9 | 統一 '0'~'9' (48~57) | 完全相容,可直接使用 |
| * | 統一 '*' (42) | ||
| # | 統一 '#' (35) |
將裝置相關 keyCode 映射為標準遊戲動作常數:
| GameAction 常數 | 對應實體鍵 |
|---|---|
Canvas.UP | 數字鍵 2、方向鍵上 |
Canvas.DOWN | 數字鍵 8、方向鍵下 |
Canvas.LEFT | 數字鍵 4、方向鍵左 |
Canvas.RIGHT | 數字鍵 6、方向鍵右 |
Canvas.FIRE | 數字鍵 5、方向鍵確定 |
Canvas.GAME_A | 數字鍵 1 或 7 |
Canvas.GAME_B | 數字鍵 3 或 9 |
Canvas.GAME_C | 數字鍵 7 或 * |
Canvas.GAME_D | 數字鍵 9 或 # |
protected void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch (action) {
case Canvas.UP: player.moveUp(); break;
case Canvas.DOWN: player.moveDown(); break;
case Canvas.LEFT: player.moveLeft(); break;
case Canvas.RIGHT: player.moveRight(); break;
case Canvas.FIRE: player.fire(); break;
case Canvas.GAME_A: player.specialA(); break;
// ...
}
}
import com.nokia.mid.ui.FullCanvas;
protected void keyPressed(int keyCode) {
if (keyCode == FullCanvas.SOFTKEY1) { /* 左軟鍵 */ }
else if (keyCode == FullCanvas.SOFTKEY2) { /* 右軟鍵 */ }
else { /* 通用 GameAction 處理 */ }
}
僅限 Nokia 系列,其他廠商無此 API。跨平台專案建議封裝 KeyHandler 介面,依平台注入實作。
keyCodeList, Form) 避開鍵值問題KeyMap.properties 記錄各機型對應表getGameAction 可能失效,需加入觸控事件處理