」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 太空衛士 - 擊退敵人

太空衛士 - 擊退敵人

發佈於2024-08-05
瀏覽:257

在最後一部分中,我們創建了玩家的飛船並使其移動。在這一部分中,我們將創建敵人並讓他們移動。然後我們會把他們擊落!

創造敵人

我們將做與創建項目符號時類似的事情。我們將創建一個模板敵人,每次我們想要創建新敵人時都會克隆它。我們還需要透過數組來追蹤敵人,因為同時可能有多個敵人。

但首先,我們將創建創建敵人的方法。在createBullet方法後加入以下程式碼:

let enemyTemplate: PIXI.Graphics | undefined = undefined;
function createEnemy() {
    if(!enemyTemplate) {
        enemyTemplate = new Graphics();
        enemyTemplate
            .poly([
                0, 0,
                50, 0,
                25, 25,
            ])
            .fill(0xFF6666);
    }

    const enemy = enemyTemplate.clone();
    enemy.x = 25   (Math.random() * 480) - 50;
    enemy.y = -50;

    return enemy;
}

如您所見,它與 createBullet 方法非常相似。我們創建一個模板敵人,每次想要創建新敵人時都會克隆該模板敵人。然後我們將敵人定位在螢幕頂部的隨機 x 位置。敵人的形狀與玩家的船相同,但它是紅色的並且是上下顛倒的。

我們透過設定 x 和 y 屬性來指定敵人的生成位置。 x 屬性設定為 25 到 480 - 50 之間的隨機值,以便敵人始終位於遊戲畫面內。 y 屬性設定為 -50,這樣敵人就在螢幕之外,並且會移入其中。

接下來,我們需要每隔幾秒鐘呼叫這個方法來建立一個新的敵人。

生成敵人

我們將為此使用 setInterval 方法。在我們定義項目符號陣列的位置之後加入以下程式碼:

const enemies: PIXI.Graphics[] = [];

const enemySpawnInterval = 2500;
function spawnEnemy() {
    if(!document.hasFocus()) {
        return;
    }
    const enemy = createEnemy();
    enemies.push(enemy);
    app.stage.addChild(enemy);
}

setInterval(spawnEnemy, enemySpawnInterval);
spawnEnemy();

我們創建一個名為敵人的新數組來追蹤所有敵人。然後我們建立一個名為enemySpawnInterval的新變量,它指定我們想要產生新敵人的頻率。然後我們創建一個名為spawnEnemy的新方法,它創建一個新的敵人並將其添加到敵人數組和舞台中。然後,我們使用 setInterval 方法每隔敵人SpawnInterval 毫秒來呼叫此方法。

酷,現在我們每 2.5 秒就會在螢幕頂部生成一次敵人。但它們還沒有移動,我們也看不到它們,因為它們已經超出了螢幕。讓我們解決這個問題。

移動敵人

我們需要在遊戲循環中更新敵人的位置。將以下程式碼加入您的遊戲循環中,就在我們更新子彈位置的下方:

for(let i = 0; i  app.screen.height   50) {
        app.stage.removeChild(enemy);
        enemies.splice(i, 1);
    }
}

這部分程式碼將循環遍歷所有敵人,透過將它們向下移動 2.5 像素來更新它們的位置,並檢查它們是否出界。如果是,我們將它們從舞台和敵人陣列中移除。

好的!如果你現在運行遊戲,你會看到敵人在螢幕頂部生成並向下移動。

現在是時候擊落他們了!

射擊敵人

將以下程式碼加入您的遊戲循環中,就在我們更新敵人位置的位置下方:

for(let i = 0; i  enemy.x &&
            bullet.x  enemy.y &&
            bullet.y 


這部分程式碼將循環遍歷所有子彈和所有敵人,並檢查子彈是否擊中敵人。如果是這樣,我們將子彈和敵人從舞台及其各自的陣列中移除。

當子彈擊中敵人時,您可以透過打破內部循環來優化此程式碼,但就目前而言,這很好。您也可以將子彈位置更新循環與子彈命中檢查循環結合起來,但為了本教程的清晰起見,我喜歡將它們分開。

就是這樣!現在,您可以在遊戲中左右移動、發射子彈並擊落敵人。在下一部分中,我們將在遊戲中添加一些 HUD 元素,並追蹤玩家的得分、等級和生命。



不要忘記訂閱我的時事通訊,成為第一個了解與這些類似的教程的人。

版本聲明 本文轉載於:https://dev.to/mrlinxed/space-defender-part-3-the-enemies-11o3?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-07-14
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&華儀的函數時,在接受成員函數指針的函數時,要在函數上既要提供指針又可以提供指針和指針到函數的函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此...
    程式設計 發佈於2025-07-14
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-07-14
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-14
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-14
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-14
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    在Microsoft Visual C 中,Microsoft consions用戶strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    程式設計 發佈於2025-07-14
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-07-14
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-07-14
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-07-14
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-14
  • Python高效去除文本中HTML標籤方法
    Python高效去除文本中HTML標籤方法
    在Python中剝離HTML標籤,以獲取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    程式設計 發佈於2025-07-14
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-07-14
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-07-14
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-07-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3