私はこの問題を数日前から頭に浮かべていましたが、満足のいく結論に達していないので、私は彼らの意見をSOの乗組員に尋ねると考えました。私が作業しているゲームでは、hereとhereのようにコンポーネントオブジェクトモデルを使用しています。実際にはかなりうまくいっていますが、私の現在のストレージソリューションは制限されています(クラス名または任意の "ファミリ"名でコンポーネントを要求することができます)。私が望むのは、与えられた型を要求し、その型のすべてのコンポーネントまたはそれから派生した型を反復する能力です。階層構造のための構造コンポーネントストレージ
これを考慮すると、基本クラス型を派生型でその順序で格納する簡単なRTTIスキームが最初に実装されました。つまり、スプライトのRTTIは:component :: renderable :: spriteです。これにより、Bのすべての要素を単純に比較することによって、型AとBを派生させるかどうかを簡単に比較できます。つまり、component :: renderable :: spriteはcomponent :: renderableから派生していますが、component :: timerではありません。シンプルで、効果的で、すでに実装されています。
私が今したいのは、その階層を表す方法でコンポーネントを保存する方法です。各ノードで
component
/ \
timer renderable
/ / \
shotTimer sprite particle
私はそのタイプのすべてのコンポーネントのリストを格納します:心に来る最初の事はそうのようなノードとしてのタイプを使用して、ツリー、です。このようにして、 "component :: renderable"ノードを要求すると、派生型に関係なく、すべてのレンダリング可能なコンポーネントにアクセスできます。
for_each(renderable.begin(), renderable.end(), renderFunc);
とレンダリング可能なダウンからツリー全体にわたりその反復を持っている:RUBは、私がこのような何かを行うことができるように、イテレータでそれらのコンポーネントにアクセスできるようにしたいということです。私はこれをかなり醜いmap/vector/treeノード構造と私が行った場所のノードスタックを追跡するカスタム順方向イテレータを使って動作させています。しかし、実装している間は、より良い、より明確な方法が必要であると感じました...私はちょうど考えることができません:(
これは不必要に複雑ですか?いくつかの明白な単純化は、私が行方不明、または私が使用してしなければならない構造を既存の?それとも、このちょうどinheritly複雑な問題であり、私はおそらくあなたが持っている任意の入力に対してうまくすでに?
感謝をやってるんだよ!
追加/削除以上のトラバースが必要です。状況によっては、一度に数百〜数千のコンポーネントを使用する予定です。私はあなたが言った方法を考えていますが、それでもまだそれを支配していませんが、ストレージ要件の大きなファンではありません。しかし、最良の選択肢かもしれません。 – Toji
あなたはboost :: graphを見ましたか? – MadCoder
私は実際に持っています。私もそれを強く考えていましたが、私のところでいくつかの簡単なテストを行ったところ、私が必要としていた方法で使用されたときには、私はそれを間違って使っていたかもしれません。もう一度見なければならない。 – Toji