引入視覺特效層與道具系統:爆炸動畫播放期間凍結邏輯、導彈清屏效果,探討效果層與邏輯層通信模式。
復用 GameObject (含 Sprite、幀動畫、生命週期):
// 初始化 (一次)
Image img = ImageTools.getImage("/pic/explosion.png"); // 多幀動畫圖集
explosion = new GameObject(img, 32, 32); // 幀尺寸 32x32
// 觸發爆炸
explosion.reset();
explosion.lifetime = 3; // 存活 3 幀
explosion.sprite.setPosition(bulletX - 16, bulletY - 16); // 居中於碰撞點
if (gameOver) {
// 效果層獨立更新渲染
explosion.paint(g);
explosion.update(); // 內部幀計數 + lifetime 判斷
if (!explosion.alive) { // 動畫播完
plane.alive = false; // 正式移除玩家
// 繪製結算評價...
}
}
缺點:硬編碼耦合、gameOver 全局標記污染邏輯、無擴展性。
進階方向:
onComplete 回調,解耦邏輯。導彈激活時,跟隨飛機位置,調用子彈管理器的區域殺傷:
if (bomb.alive) {
bomb.moveto(plane.sprite.getX() - 20, plane.sprite.getY() - 20); // 相對位置
bomb.paint(g);
bomb.update();
// 核心:殺死半徑 32 內所有敵方子彈
bullets.killBullets(plane.sprite, 32);
}
killBullets 實現public void killBullets(Sprite planeSprite, int range) {
for (int i = 0; i < bullets.length; i++) {
if (bullets[i][5] != 0) { // 存活
if (isCollision(planeSprite, i, range)) {
bullets[i][5] = 0; // 標記死亡
initBullet(i); // 重置為新子彈 (對象池模式)
}
}
}
}
GameObject 的反思將「生命週期」封裝在 GameObject 內尚可 (顯示控制)。 但「生命週期邏輯」 (幀計數、時間驅動、事件觸發) 應剝離為獨立 EffectController或狀態機,支援更複雜的時序 (延遲、循環、疊加)。