2011-09-20 10 views
9

(nota al margen: Esta es la programación de juegos)LuaBind: ¿Cómo vincular una instancia específica de clase a Lua?

Encuadernación clases enteras de LUA utilizando LuaBind es fácil:

class test 
{ 
    test() 
    { 
     std::cout<<"constructed!"<<std::endl; 
    } 

    void print() 
    { 
     std::cout<<"works!"<<std::endl; 
    } 
} 

// en otro lugar

module[some_lua_state] 
    [ 
     class_<test>("test") 
     .def(constructor<>()) 
     .def("print",&test::print) 
    ]; 

Ahora puedo crear instancias de la clase en Lua y úsalo:

lua_example.lua

foo = test() //will print "constructed!" on the console 
foo:print() //will print "works!" on the console 

Sin embargo, ahora me gustaría vincular una instancia específica de prueba a Lua. Esto me permitiría pasar objetos a Lua, p. una instancia de la clase del jugador y hacer algo como:

Player:SetPosition(200,300) 

en lugar de ir por el camino difícil y tener algo así como

SetPosition("Player",200,300) 

donde la correspondiente función de C SetPosition ++ necesita buscar un std: : mapa para encontrar el jugador.

¿Esto es posible? Si es así, ¿cómo puedo hacerlo en LuaBind?

Respuesta

18

No enlazar instancias de clases a Lua. Las instancias de clases son solo datos, y puede pasar datos a Lua a través de los medios habituales. Los objetos C++ son especiales; porque están registrados a través de Luabind, debes usar los métodos de Luabind para proporcionarlos a los scripts de Lua.

Existen varias formas de proporcionar datos a Lua, y Luabind las cubre a todas. Por ejemplo, si tiene un objeto x, que es un puntero a la clase X que está registrada con Luabind, hay varias maneras en que puede dar Lua x.

Puede establecer el valor de x en una variable global. Esto se hace a través de la interfaz de Luabind object y la función globals:

luabind::globals(L)["NameOfVariable"] = x; 

Obviamente, se puede poner esto en otra mesa, que vive en otra mesa, etc, que es accesible desde el estado global. Pero deberá asegurarse de que todas las tablas existan.

Otra forma de pasar estos datos a Lua es llamar a una función Lua y pasarla como parámetro. Puede usar la interfaz luabind::object para obtener una función como un objeto, luego use luabind::call_function para llamarlo. A continuación, puede pasar x como parámetro de la función. Alternativamente, si prefiere la sintaxis del estilo lua_pcall, puede ajustar x en un luabind::object y colocarlo en la pila con luabind::object::push.

+1

Han pasado un par de horas desde que lo respondiste, pero gracias de nuevo. luabind :: globals lo hace todo muy, muy fácil. También luabind ha elevado mi respeto por la metaprogramación de plantillas en C++ a un nuevo nivel. – TravisG

Cuestiones relacionadas