MIDP 2.0 引入 javax.microedition.lcdui.game.Sprite,大幅簡化 2D 遊戲角色動畫管理。本文系統整理 Sprite 核心功能:幀分割、幀切換、定位繪製、旋轉鏡像、參考點定位、像素級碰撞檢測,附代碼範例與常見坑點提示。
構造函數:public Sprite(Image image, int frameWidth, int frameHeight)
IOException。setFrame(int index):指定顯示第幾幀nextFrame() / prevFrame():循環切換下一/上一幀getFrame():取得當前幀索引getFrameSequenceLength() / setFrameSequence(int[]):自定義播放序列(如 0,1,2,1 實現來回動畫)setPosition(int x, int y):設定精靈左上角座標(參考點預設為左上角)paint(Graphics g):繪製到傳入的 Graphicsplane.setPosition(getWidth()/2, getHeight()/2);
plane.paint(g);
setTransform(int transform)
| 常量 | 效果 |
|---|---|
| TRANS_NONE | 無變換 |
| TRANS_ROT90 | 順時針 90° |
| TRANS_ROT180 | 180° |
| TRANS_ROT270 | 270° |
| TRANS_MIRROR | 水平鏡像 |
| TRANS_MIRROR_ROT90 | 鏡像 + 90° |
| TRANS_MIRROR_ROT180 | 鏡像 + 180° |
| TRANS_MIRROR_ROT270 | 鏡像 + 270° |
plane.setTransform(Sprite.TRANS_ROT90);
注意:變換會改寬高,getWidth()/getHeight() 回傳變換後尺寸。
defineReferencePixel(int x, int y):設定相對精靈左上角的參考點(如角色腳底中心)setRefPixelPosition(int x, int y):將參考點移到螢幕絕對座標 (x,y)plane.defineReferencePixel(0, 12); // 假設幀高 24,腳底中心
plane.setRefPixelPosition(getWidth()/2, getHeight()/2); // 置中
配合參考點可實現「腳踩地面」而非「頂貼邊緣」的自然定位。
boolean collidesWith(Sprite s, boolean pixelLevel)
pixelLevel=false:矩形邊界框相交即判定碰撞(快但不精確)pixelLevel=true:僅當非透明像素重疊才判定碰撞(精確,較耗效能)if (hero.collidesWith(enemy, true)) {
// 真正接觸才觸發
}
setFrameSequence 避免在主迴圈手動算索引。System.currentTimeMillis() 或 Timer 控制幀率,避免跑滿 CPU。Image 物件(傳入構造函數),避免重複載入。collidesWith 會自動考慮當前變換狀態,無需手動換算。setVisible(false) 可隱藏精靈,paint 會跳過,節省繪製開銷。Sprite 封裝了幀管理、幾何變換、碰撞檢測三大核心,是 MIDP 2.0 遊戲開發的基石。善用幀序列、參考點、像素級碰撞,能以極少代碼實現專業級 2D 角色控制。