2011-09-20 14 views
9

(sidenote: Ta gra jest programowanie)LuaBind: Jak powiązać określoną instancję klasy z Lua?

Oprawa całych klas do Lua za pomocą LuaBind jest proste:

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

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

// gdzieś indziej

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

Teraz mogę tworzyć instancje klasy w Lua i użyj go:

lua_example.lua

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

Jednak teraz chciałbym powiązać konkretny przypadek testu z Lua. To umożliwiłoby mi przekazywanie obiektów do Lua, np. instancją Player-klasy i zrobić coś takiego:

Player:SetPosition(200,300) 

W przeciwieństwie do dzieje się w przykry sposób i mając coś takiego

SetPosition("Player",200,300) 

którym odpowiada C funkcja setPosition ++ musi patrzeć std: : map, aby znaleźć gracza.

Czy jest to możliwe, a jeśli tak, jak mogę to zrobić w LuaBind?

Odpowiedz

18

Nie wiążisz wystąpień klas z Lua. Wystąpienia klas są po prostu danymi i możesz przekazywać dane do Lua w zwykły sposób. Obiekty C++ są jednak specjalne; ponieważ są rejestrowane przez Luabind, musisz użyć metod Luabind, aby dostarczyć je do skryptów Lua.

Istnieje kilka sposobów przekazywania danych Lua, a Luabind obejmuje je wszystkie. Na przykład, jeśli masz obiekt x, który jest wskaźnikiem do klasy X, która jest zarejestrowana w Luabind, istnieje kilka sposobów, które możesz podać Lua x.

Można ustawić wartość x na zmienną globalną. Odbywa się to poprzez object interfejsu Luabind i funkcja globals:

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

Oczywiście, że można umieścić w innej tabeli, która mieszka w innej tabeli, itp, która jest dostępna od stanu globalnej. Musisz jednak upewnić się, że wszystkie tabele istnieją.

Innym sposobem przekazania tych danych do Lua jest wywołanie funkcji Lua i przekazanie jej jako parametru. Możesz użyć interfejsu luabind::object, aby uzyskać funkcję obiektu, a następnie zadzwoń pod numer luabind::call_function. Następnie można po prostu przekazać x jako parametr tej funkcji. Ewentualnie, jeśli wolisz składnię stylu lua_pcall, możesz owinąć x w luabind::object i wepchnąć go do stosu za pomocą luabind::object::push.

+1

Minęło kilka godzin, odkąd odpowiedziałeś, ale jeszcze raz dziękuję. luabind :: globals to wszystko bardzo, bardzo łatwe. Również luabind podniósł mój szacunek do metaprogramowania szablonu w C++ na nowy poziom. – TravisG

Powiązane problemy