2011-09-20 13 views
9

(sidenote: Questa è la programmazione di videogiochi)LuaBind: come associare un'istanza di classe specifica a Lua?

Binding intere classi di Lua usando LuaBind è facile:

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

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

// qualche altra parte

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

Ora posso creare istanze della classe in Lua e usarlo:

lua_example.lua

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

Tuttavia, ora mi piacerebbe associare un'istanza specifica di test a Lua. Ciò mi consentirebbe di passare oggetti a Lua, ad es. un'istanza del lettore di classe e fare qualcosa di simile:

Player:SetPosition(200,300) 

invece di andare nel modo più duro e avere qualcosa di simile

SetPosition("Player",200,300) 

dove la corrispondente funzione C SetPosition ++ ha bisogno di cercare uno std: : mappa per trovare il giocatore.

E 'anche possibile e se sì, come posso farlo in LuaBind?

risposta

18

Non si associano le istanze di classi a Lua. Le istanze di classi sono solo dati e puoi passare i dati a Lua con i soliti mezzi. Tuttavia gli oggetti C++ sono speciali; poiché sono registrati tramite Luabind, devi usare i metodi di Luabind per fornirli agli script di Lua.

Ci sono diversi modi per fornire dati a Lua e Luabind li copre tutti. Ad esempio, se si dispone di un oggetto x, che è un puntatore alla classe X registrata con Luabind, esistono diversi modi per fornire Lua x.

È possibile impostare il valore di x in una variabile globale. Questo viene fatto attraverso l'interfaccia di Luabind object e la funzione globals:

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

Ovviamente, si può mettere che in un altro tavolo, che vive in un altro tavolo, ecc, che è accessibile dallo stato globale. Ma dovrai assicurarti che tutte le tabelle esistano.

Un altro modo per passare questi dati a Lua è chiamare una funzione Lua e passarla come parametro. È possibile utilizzare l'interfaccia luabind::object per ottenere una funzione come oggetto, quindi utilizzare luabind::call_function per chiamarlo. È quindi possibile passare semplicemente x come parametro alla funzione. In alternativa, se preferisci la sintassi dello stile lua_pcall, puoi inserire x in un luabind::object e inserirla nello stack con luabind::object::push.

+1

Sono passate un paio d'ore da quando hai risposto, ma grazie ancora. luabind :: globals rende tutto molto semplice. Anche luabind ha elevato il mio rispetto per la metaprogrammazione dei modelli in C++ a un nuovo livello. – TravisG

Problemi correlati