遊戲特效(爆炸、煙霧等)常覆蓋在遊戲畫面上,但與邏輯層有時序依賴:爆炸期間凍結玩家輸入、等待動畫結束再顯示分數。簡易做法是使用全域旗標 gameOver 協調,但會導致硬編碼、難以擴展。理想架構應採用狀態機 + 回呼介面,本文仍以簡易旗標示範。
// 單次初始化
Image expImg = ImageTools.getImage("/pic/explosion.png"); // 32x32 多幀圖
explosion = new GameObject(expImg, 32, 32);
// 每局初始化
explosion.reset();
explosion.lifetime = 3; // 3 幀
// 主迴圈中
if (gameOver) {
explosion.paint(g);
explosion.update(); // 內部遞減 lifetime
if (!explosion.alive) {
plane.alive = false;
// 繪製結束畫面、分數評語...
}
}
GameObject 內建 lifetime(幀數)與 alive 旗標,update() 每幀遞減,歸零則標記死亡。
if (bomb.alive) {
bomb.moveTo(plane.x - 20, plane.y - 20); // 跟隨飛機
bomb.paint(g);
bomb.update();
bullets.killBullets(plane.sprite, 32); // 半徑 32 內子彈全清
}
導彈本質是一個特效物件,啟用時呼叫 Bullets.killBullets() 清除範圍內敵彈。
EffectController 統一管理。Effect 介面,含 onComplete() 回呼補充獎懲系統(分數、生命、道具掉落),並嘗試重構為可擴展的組件化架構。