LuaBind:如何将类的特定实例绑定到Lua
LuaBind: How to bind specific instance of class to 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
然而,现在我想绑定一个特定的test实例到Lua。这将使我能够将对象传递给Lua,例如Player-class的实例,并执行如下操作:
Player:SetPosition(200,300)
而不是艰难地使用
SetPosition("Player",200,300)
中对应的c++ SetPosition函数需要查找std::map<std::string,Entity>查找播放器
这是可能的,如果是这样,我怎么能在LuaBind?
不能将类的实例绑定到Lua。类的实例只是数据,您可以通过通常的方式将数据传递给Lua。c++对象是特殊的;因为它们是通过Luabind注册的,所以你必须使用Luabind方法将它们提供给Lua脚本。
有几种向Lua提供数据的方法,Luabind涵盖了所有这些方法。例如,如果你有一个对象x
,它是一个指向类X
的指针,在Luabind中注册,有几种方法可以给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
一起推入堆栈。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 将类实例函数绑定到 v8::FunctionTemplate
- 尝试将实例传递到绑定的函数C
- 将 std::function 绑定到不同对象实例的同一函数
- Boost::将sigaction函数引用绑定到实例
- 将 Java 类实例绑定到C++类实例
- 是否可以为现有类的实例绑定新属性,例如 c++ 中的 JavaScript?
- 运行时绑定和模板实例化
- std::将成员函数绑定到 nullptr 处的实例,导致看似随机的 this 指针
- LuaBind:如何将类的特定实例绑定到Lua
- 使用std::bind分别绑定参数和对象实例
- 确定性随机数生成器绑定到实例(线程无关)
- 这是引用到非常量绑定到临时的实例吗?