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 支援裝置的操作體驗問題。