首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 遊戲 API 核心類 Sprite 精靈完整解析:動畫、變換與碰撞檢測

     編輯:J2ME

MIDP 2.0 引入 javax.microedition.lcdui.game.Sprite,大幅簡化 2D 遊戲角色動畫管理。本文系統整理 Sprite 核心功能:幀分割、幀切換、定位繪製、旋轉鏡像、參考點定位、像素級碰撞檢測,附代碼範例與常見坑點提示。

一、圖像分割:單圖多幀

構造函數:public Sprite(Image image, int frameWidth, int frameHeight)

  • 需準備一張橫向排列所有動畫幀的圖片(寬 = 幀寬 × 幀數,高 = 幀高)。
  • 所有幀寬高必須一致,否則拋 IOException。
  • Sprite 內部自動按寬度等分切割,幀索引 0 到 N-1。

二、幀控制

  • setFrame(int index):指定顯示第幾幀
  • nextFrame() / prevFrame():循環切換下一/上一幀
  • getFrame():取得當前幀索引
  • getFrameSequenceLength() / setFrameSequence(int[]):自定義播放序列(如 0,1,2,1 實現來回動畫)

三、定位與繪製

  • setPosition(int x, int y):設定精靈左上角座標(參考點預設為左上角)
  • paint(Graphics g):繪製到傳入的 Graphics
plane.setPosition(getWidth()/2, getHeight()/2);
plane.paint(g);

四、旋轉與鏡像(8 種變換常量)

setTransform(int transform)

常量效果
TRANS_NONE無變換
TRANS_ROT90順時針 90°
TRANS_ROT180180°
TRANS_ROT270270°
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。
  • 記憶體:大量 Sprite 共用同一 Image 物件(傳入構造函數),避免重複載入。
  • 變換後碰撞:collidesWith 會自動考慮當前變換狀態,無需手動換算。
  • 可見性:setVisible(false) 可隱藏精靈,paint 會跳過,節省繪製開銷。

總結

Sprite 封裝了幀管理、幾何變換、碰撞檢測三大核心,是 MIDP 2.0 遊戲開發的基石。善用幀序列、參考點、像素級碰撞,能以極少代碼實現專業級 2D 角色控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved