我正在用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 ++解决这个问题?
答案 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.
}