Question

I'm using Luabind to bind my Lua scripts to my C++ engine. (it uses lua 5.1.4)

I added a new lua script called "controller.lua" which my entities script, called "cat.lua", will reference and use. One the c++ calls the method "Update" it's all in the hands of Lua.

But once I try to pass my binded c++ methods to the new script file, it feels like all the bindings from that c++ object disapear. I get the following error:

Expression: scripts/controller.lua:5(method MoveUp) scripts/controller.lua:5: attempt to call method 'GetComponent' (a nil value)

Here is some C++ snippets

// 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
}

The entities code being called by c++ (When it executes it returns the Cat table to 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

and the Controller

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

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

return Controller

Bonus points: When I make a change to the controller that doesn't work (like if I just threw an s character anywhere), the controller loads up nil, no warnings. Is there some way to make it throw warnings?

Is there a better way I should be doing to "link" to other lua files, like the way im working with Controller?

Was it helpful?

Solution

Thanks to ToxicFrog on Freenode chat for helping me figure this one out.

Basically: I was calling controller MoveUp like so:

controller:MoveUp(entity)

which of course translates into

controller.MoveUp(controller, entity)

and the function was defined as

function Controller.MoveUp(entity)

this "entity" was accepted as the first parameter, controller, while the actual entity is discarded per spec.

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top