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 回答