GameCanvas 核心優勢
MIDP 2.0 引入 GameCanvas,解決 MIDP 1.0 遊戲開發痛點:
- 離屏緩衝:繪圖至記憶體再一次性刷新螢幕,消除閃爍
- 按鍵狀態輪詢:
getKeyStates() 即時取得按鍵狀態,無事件延遲
- 效能提升:可選擇忽略非遊戲按鍵事件(
suppressKeyEvents=true)
核心 API
| 方法 | 說明 |
GameCanvas(boolean suppressKeyEvents) | 建構子,true 時忽略非遊戲鍵事件 |
getGraphics() | 取得離屏緩衝的 Graphics 物件 |
flushGraphics() | 將離屏緩衝完整刷新至螢幕 |
flushGraphics(x, y, w, h) | 僅刷新指定區域(局部更新更高效) |
getKeyStates() | 回傳位元遮罩,即時檢查按鍵狀態 |
按鍵狀態檢查範例
int keyStates = getKeyStates();
if ((keyStates & LEFT_PRESSED) != 0) {
// 處理左移
} else if ((keyStates & RIGHT_PRESSED) != 0) {
// 處理右移
} else if ((keyStates & UP_PRESSED) != 0) {
// 處理上移
} else if ((keyStates & DOWN_PRESSED) != 0) {
// 處理下移
}
遊戲主迴圈架構
public void run() {
while (running) {
// 1. 檢查按鍵狀態
int keys = getKeyStates();
handleInput(keys);
// 2. 更新遊戲邏輯
updateGameState();
// 3. 繪製至離屏緩衝
Graphics g = getGraphics();
render(g);
// 4. 刷新螢幕
flushGraphics();
// 5. 幀率控制
try { Thread.sleep(40); } catch (InterruptedException e) {}
}
}
與 Canvas 差異對比
| 特性 | Canvas (MIDP 1.0) | GameCanvas (MIDP 2.0) |
| 繪圖模式 | 直接繪製螢幕,易閃爍 | 離屏緩衝,無閃爍 |
| 按鍵處理 | 事件驅動 (keyPressed),有延遲 | 狀態輪詢,即時響應 |
| 重繪控制 | JVM 呼叫 paint() | 開發者主動呼叫 flushGraphics() |
| 遊戲邏輯整合 | 難以同步 | 主迴圈完整控制 |