我使用 LuaBind 在我的 C++ 应用程序中嵌入了 Lua。我需要有在多次运行中持续存在的变量,运行相同文件名的其他对象无法访问这些变量。
例如:假设我有一个名为NPC
. AnNPC
包含一个字符串,即它们运行的脚本的名称。创建an 时,NPC
会创建一个名为 的变量Health
。当一个NPC
被击中时,他们会失去 5 点生命值。脚本在 Lua 中是这样的:
local health = 10
function onHit()
health = health - 5
end
我遇到的问题是每个NPC
运行这个脚本的人都没有自己的健康实例。例如,假设我创建NPC A
,并从其生命值中减去 5。然后,我创建NPC B
. 因为它会将生命值重置为 10,所以如果我告诉NPC A
打印生命值,它会返回 10,即使它应该是 5。
如果我要为每个对象使用不同的 Lua 实例,那么它会以这种方式工作,但在这种情况下,我会一次得到数百个实例,我知道这不是一件好事。
有没有办法让变量在 Lua 中像这样工作?如果没有,是否有一种脚本语言可以有效地像这样工作?
作为参考,这是我正在测试的代码:
卢阿:
local health = 10;
function onHit()
health = health - 5
print_out(health)
end
C++:
class NPC
{
public:
NPC(lua_State* inState);
void onHit();
const char* behavior;
lua_State* luaState;
};
NPC::NPC(lua_State* inState)
{
luaState = inState;
behavior = "testBehavior.lua";
luaL_dofile(luaState, behavior);
}
void NPC::onHit()
{
luaL_loadfile(luaState, behavior);
luabind::call_function<int>(luaState, "onHit");
}
void print_out(int number) {
cout << "Health : " << number << endl;
}
int main()
{
lua_State *myLuaState = luaL_newstate();
luabind::open(myLuaState);
luabind::module(myLuaState) [
luabind::def("print_out", print_out)
];
NPC test(myLuaState);
NPC test2(myLuaState);
test.onHit();
test2.onHit();
test.onHit();
lua_close(myLuaState);
}