J2ME javax.microedition.game.Sprite 提供基本幀動畫、位置、可見性,但實戰中缺失:
作者採用漸進式封裝:Sprite → GameObject → Helicopter,展示組合優於繼承的經典實踐。
public class GameObject {
public Sprite sprite; // 內嵌原生 Sprite
public boolean alive; // 存活標記
public int lifetime = 0; // 總存活幀數(0=永久)
public int speed = 0; // 動畫速度:0=每幀切幀,N=每 N 幀切幀
private int lifecount = 0; // 已存活幀數
private int animcount = 0; // 動畫計數器
public GameObject(Image img, int frameW, int frameH) {
sprite = new Sprite(img, frameW, frameH);
reset();
}
public void move(int dx, int dy) { sprite.move(dx, dy); }
public void moveto(int x, int y) { sprite.setPosition(x, y); }
// 核心:每幀呼叫一次
public void update() {
if (!alive) return;
// 動畫幀率控制
if (++animcount > speed) {
animcount = 0;
sprite.nextFrame();
}
// 生命週期倒數
if (lifetime != 0 && ++lifecount > lifetime) alive = false;
}
public void paint(Graphics g) { if (alive) sprite.paint(g); }
public void reset() { alive = true; lifecount = 0; animcount = 0; sprite.setFrame(0); }
}
| 特性 | 原生 Sprite | GameObject | |
|---|---|---|---|
| 動畫速度 | 無(每幀 nextFrame) | speed 參數化,支援慢動作/快轉 | |
| 自動銷毀 | 無 | lifetime 幀數後自動 alive=false | |
| 重置復用 | 手動 | reset() 一鍵歸零,支援物件池 | |
| 繪製守衛 | 無 | if(!alive)return 避免繪製殘留 |
| 檔案 | 尺寸 | 幀數 | 用途 |
|---|---|---|---|
helicopter.png | 12×28 | 1 | 機身靜態 |
screws.png | 8×24 | 7 | 螺旋槳旋轉循環 |
exploit.png | 30×30 | 4 | 爆炸一次性動畫 |
載入策略: 建構子中同步載入(Image.createImage),若圖片較大建議改為非同步預載入(背景執行緒 + MediaTracker 模擬),避免啟動卡頓。
// 介面化
interface IUpdatable { void update(); }
interface IRenderable { void paint(Graphics g); }
interface IPositionable { void moveto(int x, int y); Rect getBounds(); }
// 基礎實體
abstract class Entity implements IUpdatable, IRenderable, IPositionable {
protected List parts = new Vector();
public void update() { for (GameObject o: parts) o.update(); }
public void paint(Graphics g) { for (GameObject o: parts) if (o.alive) o.paint(g); }
public void moveto(int x, int y) { for (GameObject o: parts) o.moveto(x, y); }
}
// 直升機繼承 Entity,只需在建構子組裝 parts
// 敵機、子彈、道具同理,統一納入 LayerManager 或自定義 EntityManager
本文展示了在 J2ME 受限環境下,如何以 「薄封裝 + 組合」 將原生 Sprite 昇級為具備幀率控制、生命週期、複合渲染、狀態機的實用精靈系統。GameObject 僅 50 行代碼卻解決 80% 痛點;Helicopter 證明組合模式比繼承更適合「多部件、多狀態」遊戲實體。此設計思想直接映射至現代引擎的 GameObject + Component(Unity)、Entity + Component(ECS)、Node + Sprite(Cocos2d-x)架構。