2011-07-12 75 views
2

我正在製作一款遊戲,其中幾乎所有的東西都從實體繼承。對於需要渲染的所有實體,我也有一個IRenderable接口。有關鑄造問題的幫助

加載該級別時,每個IRenderable實體都放置在IRenderable *的向量中,然後傳遞給渲染器。

當我實例化任何實體時,我將它添加到Entity *的向量中。

我想知道的是當這個實體發送一個ENTITY_DESTROYED消息時我應該做什麼?

問題是我不知道這個實體是否可以IRenderable。我不得不爲此嘗試,並且我不確定在這裏投射是否是個好主意。

我還能做些什麼來避免施放?

感謝

還有一點要注意,即使我知道它是IRenderable,指針可能因多重繼承是不同的。

+0

作爲一種警告的話,這種設計可以縮放到幾千個實體。一個更好的主意是讓實體通過控制數據(例如在實體代碼中顯式創建/銷燬可渲染對象)或使用「每次調用draw」方法來告訴某個渲染器渲染並廢除可渲染對象作爲繼承層次結構或組件模型的一部分。我自己也在自己的遊戲引擎中犯了同樣的錯誤,並且很想撤銷它......更不用說虛擬化/繼承的代價了,如果你想在PC之外運行其他任何東西。 – jheriko

回答

3

This article是我在這個問題上找到的最好的討論。我推薦它。

否則,這可能會有用。

class IRenderable; 

class Entity { 
public: 
    virtual ~Entity() {} 
    virtual IRenderable *getIRenderable() {return 0;} 
} 

class IRenderable : public Entity { 
public: 
    virtual IRenderable *getIRenderable() {return this;} 
}; 

我會稱這個解決方案爲創可貼。

+0

即使在基於組件的設計中,它如何知道與玩家相關的組件以將其移除? – jmasterx

+0

玩家可能應該是唯一知道它可以提供哪種類型的組件的組件,因此您可以註冊/取消註冊方法。什麼時候以及由誰來召集這些問題是我難以回答的難題。 *通常*,您希望控制Player的所有權來管理這些調用。 –