早期手機 (MIDP 1.0) 普遍不支持原生鍵盤重複事件與組合鍵。為實現遊戲中的「長按移動」、「雙鍵衝刺」等操作,需自建線程輪詢鍵盤狀態。
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) {}
}
}
}
}
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)
}
}
synchronized,避免並發修改異常。「組合鍵仍是提高遊戲可玩性和娛樂性的必不可少條件。」