大多数绑定的libs/packages让我们清除如何公开类型,以便可以在lua脚本上创建它。
我真正困难的是如何给出一个已经创建/实例化/分配的类对象的LUA脚本,以便您可以从LUA脚本中调用其expated/bended方法(也更新了对象C 侧)..
如果仍然不清楚,我将举一个真实的例子,这是我现在拥有的。
im使用月球将我的AIAGENT类方法暴露于LUA。它的工作,我可以在lua脚本上创建 aiagents ..但是谁在乎,我不在lua上编程,我使用lua来脚本脚本脚本我的AI代理,我的游戏一部分由我的游戏引擎创建的引擎,更新/碰撞检测和响应/绘图都是由C 代码完成的,脚本应该做的唯一的事情就是给代理商决策代码方法 )。此决策使脚本可以访问一些注册(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是最简单的方式。它也是轻巧且无依赖性的。您是说:
我真正遇到的困难是如何给予lua脚本 已经创建/实例化/分配的类对象
它确实做到了
样本: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)