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

J2ME 低階 UI 事件處理三大技術對比:keyPressed、gameAction 與 keyStates

     編輯:Java 相關知識

背景:手機按鍵處理的挑戰

J2ME 遊戲開發中,按鍵響應是核心邏輯。手機鍵盤分為功能鍵區(軟鍵、導航鍵、通話鍵)與數字鍵區(0-9、*、#)。功能鍵的鍵值跨機型差異極大,數字鍵則相對統一。

技術一:覆寫 keyPressed(MIDP 1.0 基礎)

protected void keyPressed(int keyCode) {
    // 方式 A:直接比對 keyCode(不推薦,可讀性差)
    if (keyCode == 52) { ... }
    
    // 方式 B:使用 Canvas 常數(推薦)
    if (keyCode == Canvas.KEY_NUM4) { ... }
}

缺點:所有邏輯(延遲、輸入響應、重繪)耦合在系統事件執行緒,長時間運算會阻塞 UI,導致按鍵響應延遲甚至丟失。

技術二:gameAction 遊戲動作映射(MIDP 1.0 跨機型方案)

將物理鍵映射為統一的遊戲動作常數:

遊戲動作對應鍵位
Canvas.UP數字鍵 2、向上導航鍵
Canvas.DOWN數字鍵 8、向下導航鍵
Canvas.LEFT數字鍵 4、向左導航鍵
Canvas.RIGHT數字鍵 6、向右導航鍵
Canvas.FIRE數字鍵 5、確定鍵
GAME_A/B/C/D1/3/7/9 或 7/9/*/#
int action = getGameAction(keyCode);
switch (action) {
    case Canvas.LEFT:  // 向左移動
        break;
    case Canvas.FIRE:  // 射擊/確認
        break;
}

解決了跨機型按鍵差異,但仍受限於 keyPressed 回調模型。

技術三:keyStates 按鍵狀態機制(MIDP 2.0 GameCanvas 核心)

原理:系統維護一個位元組,每個位對應一個遊戲動作鍵的按下狀態(1=按下,0=釋放)。

啟用方式

public class MyGameCanvas extends GameCanvas {
    public MyGameCanvas() {
        super(true); // true 表示啟用按鍵狀態機制
    }
}

主迴輪中輪詢

public void run() {
    while (running) {
        int states = getKeyStates(); // 獲取並清空狀態
        if ((states & LEFT_PRESSED) != 0) { /* 向左 */ }
        if ((states & RIGHT_PRESSED) != 0) { /* 向右 */ }
        if ((states & FIRE_PRESSED) != 0) { /* 射擊 */ }
        
        // 遊戲邏輯更新
        // 重繪畫面
        flushGraphics();
        Thread.sleep(50);
    }
}

優勢:

  • 完全脫離事件回調,邏輯/渲染/輸入三分離,符合傳統遊戲迴圈架構。
  • 長時間運算不會丟失按鍵狀態(系統持續記錄)。
  • 支援多鍵同時按下(如斜向移動+射擊)。

限制:僅限 GameCanvas 子類,僅處理遊戲相關鍵;啟用後 keyPressed 不再接收遊戲鍵事件。

選型建議

場景推薦技術
簡單表單/選單導航、非遊戲應用keyPressed + Canvas 常數
MIDP 1.0 遊戲、需跨機型相容gameAction 映射
MIDP 2.0 即時遊戲、動作/射擊類、需多鍵併發keyStates (GameCanvas)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved