ゲーム/シミュレーション フレームワークのクラス構造に関して、どのように進めればよいか疑問があります。私は主に自分の楽しみのためにこれを行っていることに注意してください。すでに多くの良い解決策があることを知っています:)
フレームワークの構造には、とりわけ、Scene
を含む がありますActor
。Scene
s とs の両方Actor
が、内部でどのように機能するかのいくつかの側面について、さまざまな方法で動作する可能性があります。次のように、多重継承を使用してそのような動作を実装しました。
class ActorBase : public Object { ... };
class Actor : virtual public ActorBase { ... };
class CollisionBehavior : virtual public ActorBase { ... };
class BoundingBoxCollisionBehavior : public CollisionBehavior { ... };
class MyActor : public Actor, public BoundingBoxCollisionBehavior { ... };
このように、仮想継承を使用して、アクターが何であるかの実装を、アクターが行うこと (またはどのように行うか) の実装から分離できます。Actor
とクラスの両方が実装のため...Behavior
に共通の基本クラスにアクセスする必要がありますが、物事はきちんと区分されており、継承ActorBase
元のクラスを置き換えるだけでオブジェクトの動作を簡単に変更できます。Behavior
ただし、これには制限があります。各動作は独自の内部規則に従い、オブジェクトは 1 つのオブジェクトから継承できるためBehavior
(そうでなければ、あいまいな関数呼び出しなどのために地獄が壊れてしまいます)、異なる動作を持つ 2 つのアクターが互いに相互作用することは決してありません。 . Actor
また、V8 Javascript Engine をフレームワークに統合しているため、 (または) とその可能な動作の可能な組み合わせごとにラップされた子クラスを作成する必要がScene
あり、これらのオブジェクトを JS から混合した方法でインスタンス化すると、次のようになります。再び、異なる動作をする 2 つのオブジェクトが相互に対話できないため (少なくともすべてではありません)、クラッシュします。
私が考えた別の解決策は、この多重継承構造を放棄して、次のようなものを採用することBehavior
ですBehavior
。...Behavior
可能な各動作のオブジェクト。オブジェクトにデフォルトの動作を与えることができ、それが必要になった場合 (別のデフォルトの動作を持つオブジェクトとの相互作用が発生した場合)、そのような動作を 1 つ (または両方) のオブジェクトに追加して、それらが互いに相互作用できるようにすることができます。ある種の変換ポリシーが必要ですが、それは問題ではありません。これは、動作が独自の処理を行うために必要な基本プロパティにアクセスできるようにするための循環参照 (オブジェクト インスタンスが動作インスタンスを参照し、動作インスタンスがそれが含まれるオブジェクトを参照する) を持つことを意味します。Behavior
サブクラスもfriend
s である必要がありますActor
クラス、保護されたメンバーおよび/またはプライベートメンバーにアクセスします。私はこの道があまり好きではなく、この問題を解決するためのもっとエレガントな方法があるかもしれないと思っています。
考え?:)
おまけの質問: Behavior と BehavioUr のどちらを綴るべきですか? ネイティブスピーカーではありません!
編集:おまけの質問を解決しました-インターネット上で自分がどこにいると感じるかによって異なります! :)
EDIT 2:明確Behavior
にするCollisionBehavior
ためにからに変更しました(以下の回答を参照)