Canvas/GameCanvas 低級界面編程中,按鍵處理是核心邏輯。本文對比三種機制的原理、代碼模式、優缺點與適用場景。
protected void keyPressed(int keyCode) {
// 直接判斷 keyCode
if (keyCode == Canvas.KEY_NUM4) { ... }
// 或轉換為遊戲動作
int action = getGameAction(keyCode);
switch (action) {
case Canvas.LEFT: ... break;
case Canvas.RIGHT: ... break;
}
}
keyCode 跨機型差異極大keyCode 標準化一致getGameAction() 將物理鍵映射為邏輯動作(UP/DOWN/LEFT/RIGHT/FIRE/GAME_A-D),屏蔽硬件差異public MyGameCanvas() {
super(true); // true = 支援按鍵狀態機制
}
int getKeyStates():返回位掩碼,對應位為 1 表示該遊戲鍵當前按下LEFT_PRESSED、RIGHT_PRESSED、UP_PRESSED、DOWN_PRESSED、FIRE_PRESSED、GAME_A_PRESSED...public void run() {
while (running) {
int states = getKeyStates();
if ((states & LEFT_PRESSED) != 0) { /* 向左邏輯 */ }
if ((states & RIGHT_PRESSED) != 0) { /* 向右邏輯 */ }
// 更新遊戲狀態
// 渲染幀
flushGraphics();
Thread.sleep(frameDelay);
}
}
GameCanvas 子類且構造參數 truekeyPressedkeyPressed 不再接收遊戲鍵事件(原文未詳細展開,補充說明)
getKeyStates() 或直接輪詢硬件(部分廠商擴展 API)| 維度 | keyPressed | getGameAction | getKeyStates (GameCanvas) |
|---|---|---|---|
| API 級別 | MIDP 1.0+ | MIDP 1.0+ | MIDP 2.0+ |
| 執行線程 | 系統事件線程 | 系統事件線程 | 自定義遊戲線程 |
| 長按支援 | 無 | 無 | 原生支援 |
| 功能鍵處理 | 需硬編碼 keyCode | 不支援 | 需配合 keyPressed |
| 架構適配性 | 簡單邏輯/表單 | 簡單遊戲 | 複雜實時遊戲 |
| 代碼複雜度 | 低 | 低 | 中(需遊戲循環) |
keyPressed + getGameActionGameCanvas + getKeyStates 遊戲循環getKeyStates,功能鍵(暫停/菜單)用 keyPressed掌握三種機制的邊界與組合,是 J2ME 遊戲開發者的必修課。