我一直在用C++創建遊戲。 A World
類包含所有與遊戲狀態相關的對象和主遊戲循環函數。遊戲模式中更新方法的參數
class World {
Clock clock;
Map map;
std::vector<Entity*> entities;
...
我在遊戲中的所有實體從抽象類繼承Entity
。例如:
class Player: public Entity {...};
class Enemy: public Entity {...};
class Bullet: public Entity {...};
實體由通過所有實體的列表迭代和調用每個一項所述的方法update()
更新每一幀。
爲了說明用於改變幀速率,我通過經過時間在各幀中作爲float delta
到更新方法(像大多數其他的遊戲引擎)。我碰到的問題是一個實體可能需要在update()
中引用的所有不同事物。
的Entity
類定義了虛擬更新方法如下:
virtual void update(float delta) = 0;
調用從遊戲圈這個功能看起來是這樣的:
for(int i = 0; i < entities.size(); i++) {
entities[i]->update(clock.get_delta());
}
這個偉大的工程。但是現在,比方說,我們想要添加一個功能,其中Player
可以在不同曲面上更快地移動。要知道玩家所在的表面,需要訪問屬於World
課程的Map
對象。
我們可以添加到虛擬更新方法:
virtual void update(float delta, Map *map) = 0;
但現在Enemy
和Bullet
的更新功能,必須採取新的地圖參數,即使他們不使用它。
同樣會去的任何其他對象或變量的實體需要在其更新方法。不久之後,會有數十個參數(遊戲地圖,其他實體列表,遊戲狀態信息)混淆方法定義。
我的問題是:我該如何防止這種情況?我嘗試將World
的引用作爲唯一參數傳遞,但它導致循環依賴。
這是一個有趣的問題,但它有點寬泛,有很多潛在的解決方案。在http://gamedev.stackexchange.com/上你可能會有更好的運氣。這裏有很多關於遊戲引擎架構的討論,比如[這個問題](http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity例如,體系結構)。 – bejado
循環的依賴關係可以用[向前類聲明]進行管理(http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) – JGroven
的[I當可以使用可能的複製前向聲明?](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –