我正在使用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的方式?
答案 0 :(得分:0)
感谢ToxicFrog在Freenode上的聊天,帮助我解决这个问题。
基本上:我这样调用控制器MoveUp:
controller:MoveUp(entity)
当然转化为
controller.MoveUp(controller, entity)
,函数定义为
function Controller.MoveUp(entity)
这个“实体”被接受作为第一个参数,控制器,而实际实体被按规格丢弃。