1

タイル エンジンを記述しようとしていますが、クラスの 1 つにメソッドがあり、1 つのループを使用してクラスの既存のすべてのインスタンスに対してメソッドを実行できるようにする方法が必要です。たとえば、GameObject がある場合です。 tile と呼ばれる敵と呼ばれる別の敵は、ループ内で名前を指定することなく、それらの両方に対して GameObject::render を呼び出す方法はありますか?

4

3 に答える 3

2

あなたが探しているのは、観察者のパターンです。

基本的に、クラスの多数のインスタンスに対してイベントをトリガーしようとしています。

通知するクラスのすべてのインスタンス (おそらくコンストラクター内) を登録するオブザーバー クラスがあります。

于 2012-07-31T18:32:03.763 に答える
1

あなたはいくつかの仕事をしなければなりません。たとえば、GameObject クラスのコンストラクターでは、作成中の GameObject へのポインターをリストに追加できます。次に、デストラクタで、同じリストから破棄されるオブジェクトへのポインタを削除できます。そうすれば、すべてのライブ ゲームオブジェクトへのポインターのリストが得られ、必要に応じてループすることができます。

于 2012-07-31T18:34:00.553 に答える
0
class GamePublisher{
public:
   void Attach(GameObject *);
   void Detach(GameObject *);
   void RenderGameObjects();
   static GamePublisher& GetPublisher();
}

void GamePublisher::RenderGameObjects(){
//This is just an example for simplicity, the syntax my be a little off, assuming you have knowledge of functors.
std::for_each(gameObjectContainer.begin(), gameObjectContainer.end(), render_functor);
}

//somewhere else...
class GameObject{
   public:
     virtual void Render()=0;
}

class Tile : public GameObject
{
   public:
     virtual void Render();//your implementation...
     Tile();
}

Tile::Tile() //: member initilizations...{
   GamePublisher::GetPublisher.Attach(this);
}

アタッチ/デタッチを処理する必要があり、マルチスレッドによっては、複数のスレッド間でこれを処理するためのメカニズムを考え出すか、再利用する必要があります。それ以外は、これでうまくいくと思います。幸運を。

デストラクタからのデタッチを処理できます。

于 2012-07-31T19:02:10.107 に答える