我在我的代码中实现了一个观察者(或“监听者”)模式,如下所示:
struct EntityListener
{
public:
virtual void entityModified(Entity& e) = 0;
};
class Entity
{
public:
Entity();
void setListener(EntityListener* listener);
private:
EntityListener* m_listener;
};
现在,这可以在 C++ 中运行;实体类调用entityModified()
任何需要的时候的方法。现在,我想将一些功能转移到Lua,其中的功能点就是这个监听器回调。现在,实体是从 Lua 脚本创建的。问题是,如何在Lua中实现监听器功能呢?
例如,Lua 脚本当前执行如下操作:
function initializeEntity()
-- The entity object is actually created in C++ by the helper
Entity = Helper.createEntity()
-- Here I'd like to hook a Lua function as the Entity's listener
end
一种可能的解决方案是有一个LuaListener
C++ 代码中的类包含指向 Lua 函数的“指针”,以及 Lua 特定的setListener
从 Lua 脚本调用的函数,该脚本将 Lua 函数作为参数,并创建一个LuaListener
实例并将其传递给实际的 C++setListener
.
所以 Lua 代码看起来像这样
function onModified(entity)
-- ...
end
function initializeEntity()
entity = Helper.createEntity()
entity.setListener(onModified)
end
C++ 代码看起来像这样(仅限伪代码):
class LuaListener : public EntityListener
{
private:
lua_State* state;
std::string funcName;
public:
void entityModified(Entity& e)
{
// Call function `funcName` in `state`, passing `e` as argument
}
};
class LuaEntity : public Entity
{
public:
void setListenerLua(state, funcName, ...)
{
Entity::setListener(new LuaListener(state, funcName, ...));
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)