2011-09-20 98 views
9

(旁注:这是游戏编程)LuaBind:如何将特定类的实例绑定到Lua?

使用LuaBind很容易绑定整个班的Lua:

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中使用它:

lua_example.lua

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

但是,现在我想绑定一个特定的测试实例给Lua。这将使我能够将物体传递给Lua,例如播放器类的一个实例,这样做:

Player:SetPosition(200,300) 

与之相对要硬的方式,并具有类似

SetPosition("Player",200,300) 

,其中相应的C++ SETPOSITION功能需要查找一个std: :地图寻找玩家。

这是甚至可能的,如果是这样,我怎么能在LuaBind中做到这一点?

回答

18

您不会将类的实例绑定到Lua。类的实例只是数据,您可以通过常用方式将数据传递给Lua。 C++对象虽然特殊,因为他们是通过Luabind注册的,所以您必须使用Luabind方法将它们提供给Lua脚本。

有几种方法可以将数据提供给Lua,Luabind涵盖了所有这些方法。例如,如果您有一个对象x,这是一个指向在Luabind注册的X类的指针,可以通过几种方法给Lua x

您可以将值x设置为全局变量。这是通过Luabind的object接口完成与globals功能:

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

很明显,你可以把在另一个表,住在另一个表,等等,这是从全局状态访问。但是你需要确保表格都存在。

将此数据传递给Lua的另一种方法是调用Lua函数并将其作为参数传递。您可以使用luabind::object界面来获取作为对象的功能,然后使用luabind::call_function来调用它。然后,您可以将x作为参数传递给函数。或者,如果您更喜欢lua_pcall式语法,则可以将x包装在luabind::object中,然后将其与luabind::object::push一起推入堆栈。

+1

你回答了几个小时,但再次感谢。 luabind :: globals使得这一切非常非常简单。此外,luabind将我对C++模板元编程的敬意提升到了一个新的层次。 – TravisG

相关问题