Sprite 封裝角色動畫幀管理、位置、旋轉鏡像、碰撞偵測,是 2D 遊戲主角/敵人/道具的基礎類別。
// 建構子:大圖、幀寬、幀高(所有幀尺寸必須相同)
Sprite sprite = new Sprite(image, frameWidth, frameHeight);
// 切換顯示幀
sprite.setFrame(index); // 指定幀
sprite.nextFrame(); // 下一幀(循環)
sprite.prevFrame(); // 上一幀
sprite.defineFrameSequence(new int[]{0,1,2,1}); // 自訂播放序列
// 設定左上角座標
sprite.setPosition(x, y);
// 繪製至 Graphics
sprite.paint(g);
| 常數 | 效果 |
|---|---|
| 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° |
sprite.setTransform(Sprite.TRANS_ROT90);
預設定位點為左上角,可自訂參考點實現「腳部著地」等效果:
// 設定參考點為圖片中心底部
sprite.defineReferencePixel(frameWidth/2, frameHeight);
// 以參考點定位
sprite.setRefPixelPosition(screenX, screenY);
// 像素級碰撞(true):實際像素重疊才算撞擊
// 邊界框碰撞(false):矩形框相交即算撞擊
boolean hit = sprite.collidesWith(otherSprite, true);
public class PlayerPlane extends Sprite {
public PlayerPlane(Image img) {
super(img, 32, 32); // 4 幀動畫
defineReferencePixel(16, 32); // 底部中心
}
public void update(int keyStates) {
// 移動邏輯
if ((keyStates & LEFT_PRESSED) != 0) move(-2, 0);
if ((keyStates & RIGHT_PRESSED) != 0) move(2, 0);
if ((keyStates & UP_PRESSED) != 0) move(0, -2);
if ((keyStates & DOWN_PRESSED) != 0) move(0, 2);
// 動畫播放
nextFrame();
}
public boolean checkHit(EnemyBullet bullet) {
return collidesWith(bullet, true); // 像素級碰撞
}
}