0

ゲーム/シミュレーション フレームワークのクラス構造に関して、どのように進めればよいか疑問があります。私は主に自分の楽しみのためにこれを行っていることに注意してください。すでに多くの良い解決策があることを知っています:)

フレームワークの構造には、とりわけ、Sceneを含む がありますActorScenes と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サブクラスもfriends である必要がありますActorクラス、保護されたメンバーおよび/またはプライベートメンバーにアクセスします。私はこの道があまり好きではなく、この問題を解決するためのもっとエレガントな方法があるかもしれないと思っています。

考え?:)

おまけの質問: Behavior と BehavioUr のどちらを綴るべきですか? ネイティブスピーカーではありません!

編集:おまけの質問を解決しました-インターネット上で自分がどこにいると感じるかによって異なります! :)

EDIT 2:明確BehaviorにするCollisionBehaviorためにからに変更しました(以下の回答を参照)

4

1 に答える 1

1

ここで物事を混ぜているのではないかと心配しています。あなたが指摘したように、さまざまな種類の動作があります1 :

  • 歩行行動
  • 話し方
  • 戦闘行動
  • ...

そしてもちろん、 aWalkingBehaviorと比較してFightingBehaviorも意味がないので、基本クラスを共有しても意味がありません。

そのため、アクターを使用して、それらの動作を取得するメソッドを提供するだけでよいと思います。

class Actor {
public:
    virtual WalkingBehavior const& walkingBehavior() const {
        return DefaultWalkingBehavior;
    }

    virtual FightingBehavior const& fightingBehavior() const {
        return DefaultFightingBehavior;
    }

    // ...
}; // class Actor

デフォルトの動作は、そのクラスのより通常の動作と相互作用できるように定義されています。次に、 などの各特定のインターフェイスはFightingBehavior、この動作を理解するために必要なメソッドを提供する必要があります。

情報をエンコードするこの方法は非常に用途が広いことに注意してください。クライアントに影響を与えることなく、コンパイル時に決定される動作と実行時に決定される (そして実行時に進化する可能性がある) 動作を混在させることができます。

1個人的には、組み込みのブラウザー スペル チェッカーに従っています。

于 2013-06-18T10:49:27.857 に答える