在上一篇文章中,我示範如何使用最大堆有效追蹤最遠的敵人。在本文中,我們將了解如何將其整合到遊戲機制中。
現有的實作使用事件驅動的架構。在本文中,我們將重點放在敵人事件上。這些事件將觸發衍生行動。
每個敵人都會經歷各種事件。以下是敵人可能經歷的生命週期的範例:
對於這篇文章,我對兩個事件感興趣:
(*我計劃在未來調整事件名稱,因為敵人可能會因為不同的原因而被移除。)
我創建了一個事件模型圖來視覺化不同事件如何互動。這有助於理解事物如何連結。
對於每個事件,我都有一個觸發它的命令。 (因此,事件是命令的結果。)在某些情況下,由於事件的結果,我們需要更新資料(綠色便籤描述了這一點)。三者的組合是一個垂直切片。
我的注意力將集中在綠色便條紙「塔範圍內的敵人」上。
我們的目標是每當敵人在塔的範圍內時就更新可用的敵人,如果不在則將其移除。
我們將與塔類合作。在這個類別中,我們有一個變數來儲存敵人。
將事件監聽器放置在 Tower 類別中可以集中邏輯,減少維護塔和敵人之間映射的需要。雖然這給類別增加了一些複雜性,但它確保了更好的封裝並簡化了調試,這是目前更容易採取的方向。
首先,我們將編寫一個測試來驗證範圍內的敵人是否已添加到塔的敵人堆中:
下面是對應的實作:
每當敵人移動被觸發時,我們都會檢查是否應該將敵人添加到堆中。我已經有enemyWithinRange函數,只需添加insertOrUpdate呼叫即可。
接下來,我們確保不會添加塔範圍之外的敵人:
我們之前使用enemyWithinRange進行的檢查已經涵蓋了這種情況,因此不需要額外的程式碼。
現在我們測試離開範圍的敵人是否會從塔的可見範圍中移除:
如果敵人曾經在範圍內,那麼我們可以將其移除。
最後,我們確保從遊戲中移除的敵人也會從塔堆中移除:
每當觸發事件時,如果敵人在範圍內,我們就可以將其移除。
透過將事件驅動方法與最大堆相結合,我們實現了塔樓動態優先處理敵人的有效方法。此實施與遊戲的事件系統無縫連接,確保即時更新和回應能力。
此外,在測試時,使用事件驅動方法無需將內部程式碼與測試連結。因此使測試不那麼脆弱。我們可以以任何我們想要的方式重構行為背後的程式碼,只要事件/偵聽器設定正確,測試仍然應該通過。
此實作現在可以為以下目標鋪路:
請隨意將此方法應用於您自己的塔防遊戲。
以上是攻擊射程最遠的敵人(塔防)的詳細內容。更多資訊請關注PHP中文網其他相關文章!