大多数绑定(bind)库/包都非常清楚如何公开类类型,以便可以在 Lua 脚本上创建它。
我真正遇到的困难是如何为 Lua 脚本提供一个已经创建/实例化/分配的类对象,以便您可以从 Lua 脚本调用其公开/绑定(bind)的方法(也在c++ 端)..
如果这还不清楚,我将给出我现在拥有的真实例子。
我正在使用Lunar将我的 AIAgent 类方法公开给 Lua。 它正在工作,我可以在 Lua 脚本上创建 AIAgents。但是谁在乎呢,我不是在 Lua 上编程,我使用 Lua 来编写我的 AI 代理脚本,这是我游戏的一部分引擎,由我的游戏引擎创建,更新/碰撞检测和响应/绘图都是由 C++ 代码完成的,脚本唯一应该做的就是为代理提供决策代码(在代理更新时调用的 lua 协程)方法 )。该决策脚本可以访问一些注册的(通过 Lunar)方法(GetHP、GetNAmmunition、GetPlayerPos 等。)
那么,我怎样才能给脚本我的对象?...类似这样的东西:
//-fake code- called on the AIAgent constructor, or something
lua_pushObject( luaState, this );
lua_setGlobal( "aiAgentFromC++", -1 ); // object exposed trough "aiAgentFromC++" global var
请注意,这些方法已经公开,因为我可以在脚本上创建新对象,我只是不知道如何为脚本提供 C++ 端已有的对象。
最佳答案
LuaBridge我认为这是最简单的方法。它也是轻量级且无依赖性的。你是说:
What Im having REALLY difficulties with, is how give to a Lua script an already created/instantiated/allocated class object
它正是这样做的
示例: C++
class A {
public:
void print(int x) {
std::cout<<x<<std::endl;
}
};
RefCountedPtr<A> GiveMeA()
{
static RefCountedPtr<A> a(new A);
return a;
}
int main()
{
lua_State *L = lua_open();
luaL_openlibs(L);
int s = luaL_loadfile(L, "test.lua");
luabridge::getGlobalNamespace(L)
.beginClass<A>("A")
.addConstructor<void (*)()>()
.addFunction("print",&A::print)
.endClass()
.addFunction("GiveMeA",&GiveMeA);
if ( s==0 ) {
s = lua_pcall(L, 0, LUA_MULTRET, 0);
}
report_errors(L, s);
lua_close(L);
}
在 Lua 中:
local a=A()
a:print(42)
local b=GiveMeA() --created on the C++ side
b:print(42)
关于c++ - 如何推送现有/创建/实例化的类对象以在 Lua 脚本上使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13335066/