在c ++

时间:2016-02-26 15:24:41

标签: c++ game-engine implementation

我正在用C ++编写游戏引擎。现在我有一个名为GameListener的类,它有一些游戏状态回调方法(如update()start()awake())。因此GameObject应该实现其中任何一个实际上是GameObject。这与Unity3D非常相似。

然而,问题是GameObject是否实现某种方法,它是由引擎调用的。所以我最终可能会得到一堆基本上什么都不做的空白方法。我怎么能避免这个?以某种方式注册已实现的所有方法并调用它们。 在我的游戏循环中,我有类似的东西(伪代码):

for all gamelisteners do:
gamelistener.awake();
gamelistener.update();
gamelistener.another_some_callback_method();
...

如果我有一些少量的游戏玩家和回调方法,这不是问题。但是,如果我在GameListener界面中拥有200个gamelisteners和10个回调方法,该怎么办呢?并非所有游戏玩家都实现了所有这10种回调方法,因此,我最终得到了一堆空白方法,这些方法在游戏循环中调用。

我听说在C#中这可以用反射来解决(看看实际实现了哪些方法,并且只调用它们)。我怎样才能用c ++解决这个问题?

1 个答案:

答案 0 :(得分:0)

我的一个实现是我有函数指针的结构,"实现者" (在你的情况下是GameObject)应该实现并注册那些到主框架(GameEngine)的函数指针。

因此,如果实现者为特定的回调注册了一个nullptr,那么框架应该跳过关于这个事件的暗示这个实现者。

另一方面,如果你有必须实施的强制回调,那么Gameengine不应该允许Gameobject注册它,除非它实现了..

using callback_defn1 = std::function<void()>;
using callback_defn2 = std::function<void(int)>;

struct gameengine_callbacks {
   callback_defn1 mandatory_callback1;
   callback_defn1 mandatory_callback2;
   callback_defn2 optional_callback1;
};

在GameEngine上就像是

void GameEngine::register_objects(gameengine_callbacks callbacks)
{
   if (callbacks.mandatory_callback1 == nullptr or  callbacks.mandatory_callback1 == nullptr)
   {
         throw std::invalid_argument("some msg");
   }
   // Proceed with your registration.
}