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

J2ME 2D 遊戲開發入門(五):爆炸特效與導彈道具實現

     編輯:Java 相關知識

引入視覺特效層與道具系統:爆炸動畫播放期間凍結邏輯、導彈清屏效果,探討效果層與邏輯層通信模式。

1. 爆炸特效類設計

復用 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); // 居中於碰撞點

2. 邏輯層與效果層通信:全局狀態標記法 (簡易版)

if (gameOver) {
    // 效果層獨立更新渲染
    explosion.paint(g);
    explosion.update(); // 內部幀計數 + lifetime 判斷

    if (!explosion.alive) { // 動畫播完
        plane.alive = false; // 正式移除玩家
        // 繪製結算評價...
    }
}

缺點:硬編碼耦合、gameOver 全局標記污染邏輯、無擴展性。
進階方向:

  • 狀態機:Plane 擁有狀態 (NORMAL, EXPLODING, DEAD),狀態驅動行為。
  • 回調/事件:Effect 類接受 onComplete 回調,解耦邏輯。
  • 渲染命令隊列/層疊:將可渲染對象 (Entity, Effect, UI) 分層入隊,統一排序渲染。

3. 導彈道具:清屏特效

導彈激活時,跟隨飛機位置,調用子彈管理器的區域殺傷:

if (bomb.alive) {
    bomb.moveto(plane.sprite.getX() - 20, plane.sprite.getY() - 20); // 相對位置
    bomb.paint(g);
    bomb.update();

    // 核心:殺死半徑 32 內所有敵方子彈
    bullets.killBullets(plane.sprite, 32);
}

4. 子彈管理器 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);     // 重置為新子彈 (對象池模式)
            }
        }
    }
}

5. 關於 GameObject 的反思

  • 將「生命週期」封裝在 GameObject 內尚可 (顯示控制)。
  • 但「生命週期邏輯」 (幀計數、時間驅動、事件觸發) 應剝離為獨立 EffectController 或狀態機,支援更複雜的時序 (延遲、循環、疊加)。
  • 小結

    • 爆炸:GameObject + lifetime 簡易實現,暴露硬編碼通信缺陷。
    • 導彈:復用碰撞檢測邏輯實現範圍清屏,展示組件復用威力。
    • 下一步:獎勵系統與評價機制 (已在第六篇實現),然後進入架構重構。
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved