2011-07-12 9 views
2

私はエンティティからほとんどすべてが継承されるゲームを作っています。また、レンダリングが必要なすべてのエンティティ用のIRenderableインターフェイスがあります。このキャストの問題に関するヘルプ

レベルをロードすると、IRenderableであるすべてのエンティティがIRenderable *のベクトルに配置され、レンダラに渡されます。

私が何らかのエンティティをインスタンス化するとき、それをEntity *のベクトルに追加します。

このエンティティがENTITY_DESTROYEDメッセージを送信するとき、私は正確に何をすべきでしょうか?

問題は、このエンティティがIRenderableであるかどうかわかりません。私はそれを試してキャストしなければならないだろうし、もしキャスティングが良いアイデアならここでは分からない。

キャスティングを避けるために他に何ができますか?

おかげ

もう一つのポイントは、私は、ポインタが原因多重継承に異なる場合があります、それはIRenderable知っている場合でも、注意します。

+0

警告の言葉として、この種のデザインは1000年代のエンティティにはあまりにもスケールがありません。より良いアイデアは、データを制御すること(エンティティコードでレンダラブルを明示的に作成/破棄すること)、または「呼び出しごとに描画する」メソッドを使用することによって、レンダラにレンダリング可能なレンダリングを教えさせ、継承階層またはコンポーネントモデルの一部として、 。私は自分のゲームエンジンで同じミスをしてしまい、元に戻すことが大好きです... 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

コンポーネントベースの設計であっても、Playerに関連付けられているコンポーネントをどのように削除して知っていますか? – jmasterx

+0

おそらく、プレーヤーが提供できるコンポーネントのタイプを知っている唯一のプレーヤーであるはずなので、メソッドを登録/登録解除することができます。いつ、誰によって呼び出されるかは、私が答えるのが難しい質問です。 *通常*、これらの呼び出しを管理するためにPlayerの所有権を制御するものは何でも期待します。 –

関連する問題