3

我在我的代码中实现了一个观察者(或“听众”)模式,如下所示:

struct EntityListener
{
public:
    virtual void entityModified(Entity& e) = 0;
};

class Entity
{
public:
    Entity();
    void setListener(EntityListener* listener);
private:
    EntityListener* m_listener;
};

现在,这在 C++ 中有效;Entity 类在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
4

1 回答 1

3

一种可能的解决方案是LuaListener在 C++ 代码中包含一个类,该类包含一个指向 Lua 函数的“指针”,以及一个setListener从 Lua 脚本调用的 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, ...));
    }
};
于 2014-12-02T12:17:30.077 回答