在 MIDP 2.0 游戲開發中,使用 GameCanvas 時常遇到:「玩家死亡彈出界面,提示按任意鍵繼續,但方向鍵、數字鍵 2/4/6/8/5 無反應,只有功能鍵能觸發」的現象。
GameCanvas(boolean suppressKeyEvents) 構造函數的參數含義:
true:抑制 系統對游戲鍵(UP, DOWN, LEFT, RIGHT, FIRE)的常規按鍵事件分發(keyPressed、keyRepeated、keyReleased 不會被調用)。false:保留常規按鍵事件機制,所有按鍵均正常觸發回調。若初始化時傳入 true,則方向鍵等游戲鍵不再走 keyPressed 流程,導致在該回調中判斷「任意鍵」的邏輯失效。
// 錯誤示例
public MyGameCanvas() {
super(true); // 抑制游戲鍵事件,導致方向鍵無法觸發 keyPressed
}
// 正確示例
public MyGameCanvas() {
super(false); // 保留所有按鍵事件,keyPressed 正常觸發
}
官方文檔說明:「若應用不需要常規按鍵事件,抑制它們可通過消除對 keyPressed/keyRepeated/keyReleased 的不必要系統調用來提升性能。」
適用場景:純使用 getKeyStates() 輪詢按鍵狀態的游戲主循環,不依賴事件回調。此時關閉事件分發可減少系統開銷,提高幀率。
文檔未給具體數值。實測經驗:
false,保持代碼邏輯清晰、兼容性好。super(false),在 keyPressed/keyReleased 中處理邏輯,代碼直觀且兼容所有設備。super(true) 並在 run() 循環中調用 getKeyStates(),但完全放棄事件回調,切勿混用。public void keyPressed(int keyCode) {
if (gameOver) {
gameOver = false;
resetGame();
}
// 正常游戲邏輯...
}
suppressKeyEvents 是性能優化開關,而非功能開關。除非你完全基於輪詢模式編寫游戲循環,否則請始終傳入 false,避免踩坑。