MIDP 2.0 引入 javax.microedition.lcdui.game 包,僅 5 個核心類即構建起完整 2D 遊戲框架。本文逐一解析 GameCanvas、Layer、Sprite、TiledLayer、LayerManager 的職責與協作,並以開源移植版《是男人就下一百層》為例,展示主循環、精靈動畫、鍵盤輪詢、碰撞檢測等核心邏輯實現。
| 類 | 角色 | 關鍵能力 |
|---|---|---|
GameCanvas | 遊戲繪製畫布 | 雙緩衝 (getGraphics()/flushGraphics())、鍵盤輪詢 (getKeyStates()) |
Layer (抽象) | 圖層基類 | 位置、可見性、尺寸、繪製協議 |
Sprite | 精靈 (遊戲對象) | 幀動畫 (setFrameSequence/nextFrame)、變換 (翻轉/旋轉)、碰撞檢測 (collidesWith) |
TiledLayer | 磚塊地圖 | 小圖片平鋪構建大場景、滾動視窗 |
LayerManager | 圖層管理器 | Z-order 管理、統一繪製 (paint)、圖層增刪 |
public void run() {
isOnGame = true;
while (isOnGame) {
gameCount++; gameLevelUp(gameCount);
Thread.sleep(gameSpeed);
addGameObj(); // 隨機生成橫板/翻板/傳送帶/釘板 (gameFlatObj extends Sprite)
for (gameFlatObj gfo : objList) {
gfo.up(); gfo.nextFrame(); gfo.paint(g);
if (gfo.collidesWith(gco, false)) { isOnFlat = true; gfo.doOnChar(gco); }
}
// 天降圓球 gameFlyObj
if (gfyo != null) { gfyo.go(); gfyo.nextFrame(); gfyo.paint(g); }
keyPressed(); // 輪詢鍵盤
if (!isOnFlat) gco.go();
gco.nextFrame(); gco.paint(g);
drawMenu(g); g.drawImage(gameTeeth, 0, 20, 0);
flushGraphics(); // 雙緩衝提交
chkObjIsTop(); if (gco.isDead()) setOnGame(false);
}
}
private void keyPressed() {
int ks = getKeyStates();
if ((ks & LEFT_PRESSED) != 0) { gco.setCharAct(0, isOnFlat); gco.left(isOnFlat); return; }
if ((ks & RIGHT_PRESSED) != 0) { gco.setCharAct(1, isOnFlat); gco.right(isOnFlat); return; }
gco.setCharAct(2, isOnFlat); // 站立/跳躍
}
char.png:16×17 像素/幀,共 14 幀 (站立1、左跑4、右跑4、跳躍4)。super(img, 16, 17); defineCollisionRectangle(1,16,15,1); setFrameSequence(stand);setFrameSequence(w_left/w_right/jump/stand) + 主循環 nextFrame() 推進幀。示例未使用 TiledLayer (地圖平鋪) 與 LayerManager (分層渲染),讀者可自行嘗試:用 TiledLayer 構建背景地圖,用 LayerManager 管理 背景層→平台層→主角層→UI層,解決遮擋關係。