2011-09-20 2 views
9

:LuaBind : 클래스의 특정 인스턴스를 Lua에 바인딩하는 방법은 무엇입니까?

LuaBind가 쉽게 사용 루아에 전체 클래스를 바인딩 ((!) 참고 이것은 게임 프로그래밍입니다) :

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

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

// 다른 곳에서 내가 클래스의 인스턴스를 만들 수 있습니다 지금

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

루아에서 그것을 사용하십시오 :

lua_example.lua

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

그러나 이제는 test의 특정 인스턴스를 루아에 바인딩하고 싶습니다. 이렇게하면 객체를 루아에 전달할 수 있습니다. 플레이어-클래스의 인스턴스와 같은 무언가를 :

Player:SetPosition(200,300) 

해당 C++로 setPosition 함수는 표준을 찾아 볼 필요가

SetPosition("Player",200,300) 

같은 것을 어려운 길을가는 데 반대로 : :지도를 찾아 플레이어를 찾습니다.

이 경우조차도 가능합니까? 그렇다면 루아 바인드에서 어떻게 할 수 있습니까?

답변

18

클래스 인스턴스를 루아에 바인딩하지 마십시오. 클래스의 인스턴스는 단지 데이터이며, 일반적인 방법으로 루아에 데이터를 전달할 수 있습니다. C++ 객체는 특별합니다. Luabind를 통해 등록되었으므로 Luabind 메소드를 사용하여 Lua 스크립트에 제공해야합니다.

루아에게 데이터를 제공하는 데는 여러 가지 방법이 있으며 Luabind는 루아 바인드를 모두 다루고 있습니다. 예를 들어, Luehind에 등록 된 X 클래스에 대한 포인터 인 객체 x이있는 경우 Lua에게 줄 수있는 여러 가지 방법이 있습니다 x.

x의 값을 전역 변수로 설정할 수 있습니다. 이 Luabind의 object 인터페이스를 통해 수행하고 globals 기능입니다 :

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

물론, 전역 상태에서 액세스 할 수있는 다른 테이블에 살고있는 다른 테이블, 등등에 그것을 넣을 수 있습니다. 그러나 테이블이 모두 존재하는지 확인해야합니다.

이 데이터를 루아에게 전달하는 또 다른 방법은 루아 함수를 호출하여 매개 변수로 전달하는 것입니다. luabind::object 인터페이스를 사용하여 객체로 함수를 가져온 다음 luabind::call_function을 사용하여 호출 할 수 있습니다. 그런 다음 x을 매개 변수로 함수에 전달할 수 있습니다. 또는 lua_pcall 스타일 구문을 선호하면 luabind::objectx을 입력하고 luabind::object::push과 함께 스택에 넣을 수 있습니다.

+1

답변을 한 지 2 시간이 지났지 만 다시 한 번 감사드립니다. luabind :: globals는 매우 쉽습니다. 또한 루아 바인드 (luabind)는 C++의 템플릿 메타 프로그래밍에 대한 새로운 존경심을 새로운 차원으로 끌어 올렸습니다. – TravisG

관련 문제