当我输入新文件时,Luabind对象消失了

时间:2014-01-20 01:22:10

标签: c++ lua luabind

我正在使用Luabind将我的Lua脚本绑定到我的C ++引擎。 (它使用lua 5.1.4)

我添加了一个名为“controller.lua”的新lua脚本,我的实体脚本称为“cat.lua”,它将引用和使用。一个c ++调用方法“更新”它全部掌握在Lua手中。

但是一旦我尝试将绑定的c ++方法传递给新的脚本文件,感觉就像c ++对象的所有绑定都消失了。我收到以下错误:

Expression:scripts / controller.lua:5(方法MoveUp) scripts / controller.lua:5:尝试调用方法'GetComponent'(零值)

以下是一些C ++代码段

// Definitions
module(luaState)
[
    class_<Entity>("Entity")
        .def("GetComponent", &Entity::GetComponent)
    class_<Component>("Component")
        .enum_("eComponentTypes")
        [
            value("Steering", kComponentType_Steering)
        ],
    class_<SteeringComponent>("SteeringComponent")
];

// The script components update
void ScriptComponent::Update() {
    const Entity* owner = this.GetOwner();
    mLuaDataTable["Update"](owner); // Executes the Update function on the script Cat.lua
}

由c ++调用的实体代码(当它执行时,它将Cat表返回给c ++。)

-- Cat.lua
local controller = loadfile("scripts/controller.lua")
local Cat = {}

function Cat.Update(entity)
    steeringComponent = entity:GetComponent(Component.Steering) -- Works fine
    controller:MoveUp(entity)
end

return Cat

和控制器

--controller.lua
local up = vec2(0.0, 1.0)
local Controller = {}

function Controller.MoveUp(entity)
    steeringComponent = entity:GetComponent(Component.Steering) -- Fails
end

return Controller

奖励积分: 当我对不起作用的控制器进行更改时(比如我只是在任何地方扔了一个字符),控制器加载nil,没有警告。有没有办法让它发出警告?

我是否有更好的方法来“链接”到其他lua文件,例如我使用Controller的方式?

1 个答案:

答案 0 :(得分:0)

感谢ToxicFrog在Freenode上的聊天,帮助我解决这个问题。

基本上:我这样调用控制器MoveUp:

controller:MoveUp(entity)

当然转化为

controller.MoveUp(controller, entity)

,函数定义为

function Controller.MoveUp(entity)

这个“实体”被接受作为第一个参数,控制器,而实​​际实体被按规格丢弃。

http://lua-users.org/wiki/ObjectOrientationTutorial