2011-05-05 55 views
1

在這個遊戲中,我有3個防禦塔(數量是可配置的),每30秒以30公里每小時發射一顆「子彈」。這些防禦塔有雷達,當玩家在塔式雷達下方時纔開始發射。這不是問題。我應該如何在遊戲中存儲和使用槍支火情數據?

我的問題是如何存儲槍支火災的數據。我不確定每個子彈究竟需要哪些數據,但想到的就是子彈的位置。假設我現在只需要存儲它(我已經有一個爲3D點定義的結構)。

我是否應該嘗試弄清楚遊戲在特定點可以擁有的最大子彈,並聲明一個具有該大小的數組?我應該使用鏈表嗎?或者也許別的東西?

我真的不知道該怎麼做。我不需要任何花哨或複雜的東西。一些基本的工作方式,易於使用和實施已經綽綽有餘了。

P.S:我沒有在遊戲開發網站上發佈這個問題(儘管有標籤),因爲我認爲它在這裏更合適。

+1

抱歉,但我們應該如何知道答案嗎?這取決於我們不知道的遊戲特徵。 – akappa 2011-05-05 18:09:20

回答

3

通常,固定長度的數組不是一個好主意。

鑑於您的遊戲模型,我不會去任何不允許O(1)刪除的數據結構。無論如何,這排除了普通數組,並且可能會建議一個鏈表。但是,通過使用具有正確屬性的通用容器類,應該抽象出底層細節。

至於你應該存儲什麼

  1. 位置(如你所提到的)
  2. 速度
  3. 損傷因子(你的槍升級,是不是?)
  4. 最大範圍(同上)

EDIT 要稍微複雜一點,STL類總是會放入放入其中的元素的副本,所以在實踐中如果任何屬性可能會改變對象的生存期,那麼您需要在堆和存儲上分配結構(智能?)在集合中指向它們的指針。

+1

我不同意最後的聲明。具體來說,如果子彈的授權副本是向量中的那個,並且「原始」子彈數據在插入後被丟棄,那麼他應該讓該向量爲他做記憶管理。 – 2011-05-05 19:03:03

+0

@Rob並不意味着只能通過更換整個項目來更改集合中的特定項目? – Alnitak 2011-05-06 06:36:04

+0

這讓我感到困惑。子彈正在移動,我需要繼續保存當前的子彈位置以測試碰撞,命中等。但正如您所說,我可能會使用指向真實數據的指針! – 2011-05-06 08:12:20

1

我想你可以從std::vector<BulletInfo>開始,看看它是如何工作的。它提供了類似於接口的數組,但是可以動態調整大小。

2

我可能會使用std::vectorstd::list。無論什麼最簡單。注意事項:如果你正在編寫一個非常有限的平臺(CPU速度慢,內存很小),那麼使用一個普通的固定尺寸的C數組可能是有意義的。但這些日子不太可能。從任何最簡單的代碼開始,稍後改變它,當且僅當它證明你不能提供抽象。

1

在這種情況下,我更喜歡用一個稍微複雜一些的方法來管理子彈。由於屏幕上的子彈數量與塔的數量直接相關,因此我會在每個塔級內保留一小段固定長度的子彈陣列。每當一座塔樓發射子彈時,它將搜索其陣列,找到未使用的子彈,以新的位置/速度設置子彈並將其標記爲活動狀態。

稍微更復雜的部分是我喜歡保持外部經理子彈的第二列表,說BulletManager。當每座塔被創建時,塔會將所有子彈添加到中央管理器。然後中央經理可以負責更新子彈。

我喜歡這種方法,因爲它很容易讓我來管理內存限制相關的子彈,僅僅調整了數量的積極塔號「和所有的子彈爲您創建。您不需要隨時分配子彈,因爲它們都是合併的,並且您不需要一箇中心池,在添加/刪除塔時不斷需要更改大小。

它涉及輕微的開銷移動,因爲沒有與指針列表的中央管理器。而且你需要小心,始終從中央管理人員處拆除被毀壞的塔樓的任何子彈。但對我來說,好處是值得的。

相關問題