2017-03-07 47 views
0

我一直在用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; 

但現在EnemyBullet的更新功能,必須採取新的地圖參數,即使他們不使用它。

同樣會去的任何其他對象或變量的實體需要在其更新方法。不久之後,會有數十個參數(遊戲地圖,其他實體列表,遊戲狀態信息)混淆方法定義。

我的問題是:我該如何防止這種情況?我嘗試將World的引用作爲唯一參數傳遞,但它導致循環依賴。

+1

這是一個有趣的問題,但它有點寬泛,有很多潛在的解決方案。在http://gamedev.stackexchange.com/上你可能會有更好的運氣。這裏有很多關於遊戲引擎架構的討論,比如[這個問題](http://gamedev.stackexchange.com/questions/31473/what-is-the-role-of-systems-in-a-component-based-entity例如,體系結構)。 – bejado

+0

循環的依賴關係可以用[向前類聲明]進行管理(http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) – JGroven

+0

的[I當可以使用可能的複製前向聲明?](http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration) –

回答

1

我在我的遊戲通過在Player類存儲Map*解決了這個。如果你不需要改變它,效果很好。