2015-07-10 26 views
0

我開始製作一個簡單的2D遊戲,而不是使用C++和SFML庫在局域網上運行。遊戲使用每個幀的典型更新函數及其循環來改變對象的狀態。遊戲類存儲玩家和怪物的矢量/列表以及兩個地圖(一個用於tileset - 僅用於圖形,第二個用於存放地形力學 - 牆壁,地面等)。我在每個怪物上調用一個Think()函數(它會移動/跳躍/攻擊等)(不同的怪物表現不同,但是所有這些函數都使用適當的覆蓋繼承自抽象類Monster)。簡單的遊戲設計:我害怕大量的循環

的問題是:

  1. 對於每一個怪物我需要遍歷所有其他對象來檢查衝突
  2. 對於每一個怪物,我需要找到附近的對象(其coords)使用這樣的怪物可以表現根據什麼是看到
  3. 對於每一個無生命的物體(如飛行的火球,任何其他拋射)我需要根據時間的推移,以更新其COORDS(這很容易),但再次檢查碰撞
  4. 對於每一個球員,我需要循環所有其他球員/不n-lived /怪獸收集關於近物體的信息,以便向他們發送適當的遊戲狀態。

我很害怕這個遊戲會有多少個循環/嵌套循環。
我已經看到一些遊戲實現基於小型實例的地圖世界,因此循環總是經歷少量數據,並且因爲每個地圖都是分開的,所以很容易找到任何東西/向玩家發送更新。

我可以輕鬆地將這種方法應用於每個樓層,但樓層0仍然非常大(排列在5000x5000左右的瓷磚上)。

我現在正在考慮將世界地圖數組更改爲通過座標存儲對每個對象的引用的類。我只是想出了一個想法,即通過它們的座標對物體進行排序可以提高循環的性能,甚至取代它們。

這是一個正確的設計?或者確實存在一個更好的主意?

回答

1

你不應該擔心很多循環。一旦遇到問題,您可以隨時進行優化。

但是,對於碰撞,你應該避免檢查每個對象與其他所有對象,因爲這將需要n^2檢查。不過,這隻適用於遇到性能問題的情況。如果發生這種情況,默認方法是使用網格,每個網格更新一次(或更少),以計算網格中每個對象的位置。這意味着你的每個單元都會知道它中的所有對象。 然後,如果您想查找單個對象的碰撞,則只需檢查它,並將對象放在同一單元格中和相鄰單元格中。

如果你有大量的對象,你可能會考慮動態調整網格,例如可以通過四叉樹實現。但是在大多數情況下,一個簡單的靜態定義的網格就足夠了。

+0

好吧,我有一個網格contaning碰撞,但它實際上在遊戲過程中,我會嘗試更新它,如果我得到性能問題 – Xeverous

+0

不要擔心Xeverous我也想到幾年前,但與計算機的力量這些天你不需要擔心,Howlowl是正確的,唯一需要擔心的是做碰撞檢測。我只想創建一個覆蓋屏幕的大矩形,然後只檢查其中的任何內容。我知道Howlowl已經說過,我只是想支持他:) – Canvas