我正在用C++编写一个游戏引擎。现在我有一个名为GameListener的类,它有一些游戏状态回调方法(如update()、start()、awake())。因此,GameObject应该将它们中的任何一个实现为实际的GameObject。这很像Unity3D。
然而,问题是,无论GameObject是否实现了某个方法,它都是由引擎调用的。所以我最终会得到一堆空白的方法,基本上什么也不做。我怎样才能避免这种情况?以某种方式注册所有已实现的方法并调用它们。在我的gameloop中,我有类似这样的东西(伪代码):
for all gamelisteners do:
gamelistener.awake();
gamelistener.update();
gamelistener.another_some_callback_method();
...如果我有少量的gamelisteners和回调方法,这不是问题。但是,假设我在GameListener接口中有200个GameListener和10个回调方法,那会怎么样呢?并不是所有的gamelisteners都实现了这10个回调方法,因此,我最终得到了一堆在gameloop中调用的空方法。
我听说在C#中,这个问题可以通过反射来解决(查看实际实现了哪些方法,并只调用它们)。我如何在c++中解决这个问题?
发布于 2016-02-26 23:36:36
我有一个实现,我有一个函数指针的结构,“实现者”(在你的例子中是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.
}https://stackoverflow.com/questions/35655534
复制相似问题