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

J2ME 遊戲開發核心技巧:解決 MIDP 1.0 連續按鍵檢測難題

     編輯:Java 程式設計入門

問題背景

MIDP 低層事件:keyPressed、keyReleased、keyRepeated。並非所有裝置支援 hasRepeatEvents()=true,若不支援,長按按鍵不會觸發 keyRepeated,導致遊戲角色無法連續移動。

解決方案:狀態旗標法

在 Canvas 子類中為每個方向維護 boolean 旗標(如 leftPressed、rightPressed):

  • keyPressed:對應方向旗標設 true,立即執行一次移動邏輯。
  • keyReleased:旗標設 false。
  • run() 遊戲主迴圈:每幀檢查旗標,若 true 則持續執行移動邏輯(配合 Thread.sleep(50) 控制速度)。
  • keyRepeated:若裝置支援,同樣觸發移動邏輯以增強回應。

完整範例程式碼

public class MainCanvas extends Canvas implements Runnable {
    private boolean leftPressed, rightPressed;
    private int px = getWidth()/2, py = getHeight()/2;
    private String buttonPressed = "";

    public void run() {
        while (true) {
            if (leftPressed)  left();
            if (rightPressed) right();
            try { Thread.sleep(50); } catch (InterruptedException ignored) {}
        }
    }

    private void left()  { if (px >= 0) px--; buttonPressed="LEFT";  repaint(); }
    private void right() { if (px <= getWidth()) px++; buttonPressed="RIGHT"; repaint(); }

    public void paint(Graphics g) {
        g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0x000000);
        g.drawString(buttonPressed, 20, 20, Graphics.LEFT|Graphics.TOP);
        g.drawString("J2ME", px, py, Graphics.HCENTER|Graphics.TOP);
    }

    public void keyPressed(int keyCode) {
        int action = getGameAction(keyCode);
        if (action == LEFT)  { left();  leftPressed  = true; }
        else if (action == RIGHT) { right(); rightPressed = true; }
        repaint();
    }
    public void keyReleased(int keyCode) {
        int action = getGameAction(keyCode);
        if (action == LEFT)  { leftPressed  = false; buttonPressed=""; }
        else if (action == RIGHT) { rightPressed = false; buttonPressed=""; }
        repaint();
    }
    public void keyRepeated(int keyCode) {
        int action = getGameAction(keyCode);
        if (action == LEFT) left(); else if (action == RIGHT) right();
        repaint();
    }
}

效果

啟動 MIDlet 後,長按左/右鍵,「J2ME」文字將平滑連續移動,完美解決無 keyRepeated 支援裝置的操作體驗問題。

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