MIDP 2.0 為移動開發帶來多項新特性:多媒體支援、改進的 UI、新連網協議、Push 機制、OTA 下載及增強安全性。其中最引人注目的莫過於 Game API,它位於 javax.microedition.lcdui.game 套件,專為遊戲開發量身打造。
Game API 採用分層概念:
各圖層可獨立操作、移動、繪製。遊戲世界座標系可遠大於螢幕,配合 View Window(觀察窗口) 實現平滑捲動。觀察窗口座標可直接映射至實體螢幕。
| 類別 | 用途 |
|---|---|
GameCanvas | 抽象類,遊戲畫布基礎。提供雙緩衝與物理按鍵狀態查詢,優於傳統 Canvas。 |
Layer | 抽象基類,描述可繪製元素。Sprite 與 TiledLayer 皆繼承自此。 |
LayerManager | 管理多個 Layer,按順序繪製至螢幕,支援插入/移除/排序。 |
Sprite | 單一可動物件,內含多幀動畫序列。支援碰撞檢測(像素級/矩形級)、變換(旋轉/鏡像)。 |
TiledLayer | 大型背景/地圖專用。由網格單元組成,每單元填入圖塊索引,極省記憶體構建大場景。 |
getKeyStates() 位元組操作MIDP 2.0 棄用 getGameAction(),改用位元組狀態:
protected void keyPressed(int keyCode) {
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) { /* 向左 */ }
if ((keyState & RIGHT_PRESSED) != 0) { /* 向右 */ }
if ((keyState & UP_PRESSED) != 0) { /* 向上 */ }
if ((keyState & DOWN_PRESSED) != 0) { /* 向下 */ }
}
public void run() {
Graphics g = getGraphics(); // 取得 off-screen buffer
while (playing) {
layers.paint(g, 0, 0); // 繪製所有圖層到緩衝區
if (playing) flushGraphics(); // 一次性刷新到螢幕
try { Thread.sleep(sleepTime); } catch (InterruptedException e) {}
}
}
亦可呼叫 flushGraphics(x, y, w, h) 僅更新髒矩形區域,提升效能。
// 建構:40欄 x 16列,圖塊 7x7 像素
tiles = new TiledLayer(40, 16, tilesImage, 7, 7);
// 填充單元索引(常數定義圖塊類型)
tiles.fillCells(0, 0, 40, 16, TILE_AIR);
tiles.fillCells(14, 12, 12, 4, TILE_WATER);
tiles.fillCells(0, 10, 14, 6, TILE_GROUND);
layers.append(tiles); // 加入管理器
sprite = new Sprite(spriteImage, 7, 7); // 7x7 像素/幀
// 移動方式
sprite.move(dx, dy); // 相對移動
sprite.setPosition(x, y); // 絕對定位
// 方向控制範例
switch (dir) {
case UP: sprite.move(0, -7); break;
case DOWN: sprite.move(0, 7); break;
case RIGHT: sprite.move(7, 0); break;
case LEFT: sprite.move(-7, 0); break;
}
collidesWith(Image, x, y, pixelLevel)collidesWith(Sprite, pixelLevel)collidesWith(TiledLayer, pixelLevel)defineCollisionRectangle(x, y, w, h) 自訂碰撞矩形pixelLevel=true 為像素級精準檢測,false 為矩形包圍盒檢測(效能較佳)。
Game API 解決了「遊戲世界大於螢幕」、「多圖層管理」、「精靈動畫與碰撞」三大核心痛點。雖 WTK 2.0 Beta 早期效能尚待優化,但標準化帶來的開發便利性不可估量。開發者應深思設計優於依賴平台補救缺陷。