7

私はかなり経験豊富なプログラマーですが、C++でのOOPアーキテクチャーと設計にはまだ比較的慣れていません。私の経験のほとんどは、C#とJavaに関するものです。私は最近、c++で簡単なゲームエンジンをコーディングしようと試みました。グラフィックにはSDLを使用しました。この投稿では、私のアーキテクチャについて説明し、フィードバックを受け取りたいと思います。特に、私はいくつかの助けが欲しいデザインの問題に遭遇しました。だから、ここに行きます:

  • 私の主な機能では、画面に描画するためなど、すべてのSDLのものを初期化します。
  • 次に、使用する予定のすべてのオブジェクト(床、壁、プレーヤーなど)をインスタンス化します。
  • 次に、メインループを開始します。このループは、各オブジェクトの移動、衝突検出、および衝突処理機能を実行し、それらを再描画します。
  • メインループは、アプリケーションが終了するまで実行され、反復ごとに1つのフレームを描画します。

私の問題はこれです:私は一種のインターフェーススタイルのデザインをしようとしました。これには、各オブジェクトが動作を実装できるようにする一連の抽象基本クラスが含まれます。たとえば、オブジェクトを移動可能にする場合、オブジェクトは、と呼ばれる仮想関数move()といくつかの位置座標を含む移動可能な基本クラスから継承する必要があります。衝突可能にしたい場合、オブジェクトは、仮想関数checkCollision()handleCollision()ヒットボックスメンバー変数を含む衝突可能抽象クラスから継承します。プレーヤーのようなオブジェクトは、これらの基本クラスの両方と他のいくつかのクラスから継承します。

これは、メインループですべてを手動で実行している限り、十分に機能します。私はただ言うことができます:

player.move();
player.checkCollision();
player.handleCollision();
player.draw(). 

そしてそれは大丈夫です。しかし、メインループにジェネリックオブジェクトのベクトルまたは配列を入れて、次のようなことを実行できるようにしたいと思います。

for each object in vector
    if object is of type movable
        object.move();
    if object is of type collidable
        object.checkCollision();

ダイナミックキャスティングで実現できると思っていたのですが、なかなか思いつきませんでした。それらをvoidポインタとして保存しようとしましたが、それは私が望むようには機能しません。私が試すかもしれないビデオゲーム用のこのゲームオブジェクトコンポーネントアーキテクチャについて読んでいますが、私はすでに書いたものを本当に救いたいと思っています。これは良い学習の機会だと思います。誰かアイデアがあれば、本当にありがたいです。私のアーキテクチャは、他の単純なゲームエンジンの設計とどのように比較されますか?私のインターフェースアーキテクチャは意味がありますか、それとも完全に不安定ですか?

4

2 に答える 2

9

C++ で作業している場合は、SFMLを試してください。SDLよりも高速です。また、 OpenGLを知っている場合は、それも使用できます。
あなたの問題について:

class Entity {
     //constructor and other stuff
     void virtual exec() =0; ///<= pure virtual method
};

class Movable : Entity {
    void move(); //do somthing
    void exec() {move();};
};

class Collidable : Entity {
   void col(); //do your job
   void exec(){col();};
};

std::vector<Entity*> e_v;
///push some instance
for (Entity* e : e_v)
   e->exec();
于 2012-12-26T23:12:52.730 に答える
0

基本クラスでテンプレート メソッド パターンと非抽象の空の仮想関数を使用するのはどうですか?

class Entity
{
    void update()
    {
        move();
        checkCollision();
    }

    virtual void move() {}
    virtual void checkCollision() {}
};

class Movable : public virtual Entity
{
    virtual void move() {}   // Stuff
};

class Collidable : public virtual Entity
{
    virtual void checkCollision() {}   // Stuff
};
于 2012-12-27T14:39:22.360 に答える