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

J2ME MIDP 1.0 實現組合鍵與長按檢測:基於線程的按鍵事件處理

     編輯:Java 程式設計入門

背景與挑戰

早期手機 (MIDP 1.0) 普遍不支持原生鍵盤重複事件與組合鍵。為實現遊戲中的「長按移動」、「雙鍵衝刺」等操作,需自建線程輪詢鍵盤狀態。

核心設計:NewEvent 按鍵監聽線程

  • 實現 Runnable,獨立線程運行。
  • 核心數據結構:byte[] keyCode 環形緩衝區(長度 2,支持最多 2 鍵組合)。
  • index 指向下一個寫入位置,自動環繞覆蓋舊值。
  • 同步方法保證線程安全:startAction() 記錄按下,stopAction() 清除釋放,getSwitchPoint() 檢測是否有鍵按下。

關鍵代碼片段

public class NewEvent implements Runnable {
    private final KeyEventCanvas canvas;
    private final byte[] keyCode = new byte[2];
    private byte index = 0;
    private boolean switchPoint = false;

    public synchronized void startAction(int keyCode) {
        this.keyCode[index] = (byte) keyCode;
        index = (byte) ((index + 1) % this.keyCode.length);
    }

    public synchronized void stopAction(int keyCode) {
        for (int i = 0; i < this.keyCode.length; i++) {
            if (this.keyCode[i] == (byte) keyCode) {
                this.keyCode[i] = 0;
                break;
            }
        }
    }

    public synchronized boolean getSwitchPoint() {
        switchPoint = false;
        for (byte code : keyCode) {
            if (code != 0) { switchPoint = true; break; }
        }
        return switchPoint;
    }

    public void run() {
        byte[] tmp;
        while (true) {
            while (getSwitchPoint()) {
                tmp = getKeyCode(); // 獲取當前快照
                for (byte code : tmp) {
                    if (code != 0) {
                        switch (canvas.getGameAction(code)) {
                            case Canvas.UP:    canvas.y--; break;
                            case Canvas.DOWN:  canvas.y++; break;
                            case Canvas.LEFT:  canvas.x--; break;
                            case Canvas.RIGHT: canvas.x++; break;
                        }
                    }
                }
                canvas.repaint();
                try { Thread.sleep(10); } catch (InterruptedException ignored) {}
            }
        }
    }
}

Canvas 整合

public class KeyEventCanvas extends Canvas {
    int x = 0, y = 0;
    NewEvent eventThread;

    public KeyEventCanvas() {
        eventThread = new NewEvent(this);
        new Thread(eventThread).start();
    }

    protected void keyPressed(int keyCode) {
        eventThread.startAction(keyCode);
    }

    protected void keyReleased(int keyCode) {
        eventThread.stopAction(keyCode);
    }

    protected void paint(Graphics g) {
        // 繪製角色於 (x, y)
    }
}

設計考量與限制

  • 手機鍵盤物理限制: 鍵位緊湊,三鍵以上組合操作極難,雙鍵組合(如方向+動作)是實用上限。
  • 環形緩衝區長度 2: 平衡內存與功能,足以覆蓋主流遊戲組合鍵場景。
  • 10ms 輪詢間隔: 在響應速度與 CPU 佔用間折中,可根據遊戲類型調整。
  • 線程安全: 所有共享數組操作加 synchronized,避免並發修改異常。

「組合鍵仍是提高遊戲可玩性和娛樂性的必不可少條件。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved