我有一个带有主循环的游戏 - 在每个循环中,我调用游戏中的每个 NPC ->ProcessAI() 来执行任何操作。 这是一个服务器,所以对 ProcessAI 的调用不会像在客户端游戏中那样在每一帧上执行!它也是单线程的。
现在我想使用 luabind 扩展带有 lua 的 C++ 代码库(也许,即使有 boost 开销)。所以我将我的 NPC 类的一些功能暴露给 LUA。
例如,我想创建 Actor 脚本 - 具有更复杂行为的 Boss 战 - 无论何时在我的 C++ ProcessAI 函数中发生事件 - 我都会将其委托(delegate)给特定 NPC 的相应 lua 脚本。
我想象在我的 boss.lua 脚本中我会有这样的东西
function OnEngageCombat(NPC)
NPC:say ("Some taunts...")
ScheduleEvent(CastEvilSpell,/*time*/2000,/*numExecutions*/1,)
end
function CastEvilSpell(NPC)
NPC:CastSpell("someSpell")
end
但是 - 我不知道该怎么做 - 我收集到 ScheduleEvent 应该是一些导出到 Lua 的 C++ 函数 - 但是最好的方法是用这个来保持 NPC(老板)的对象引用并调用一个函数大约 2 秒后在该脚本中?
此外,除了这种延迟执行 - 我希望 NPC 可以相互交互 - 我目前的想法是为每个特殊 NPC 制作一个 Actor 行为脚本。
现在我想象的是发起两个NPC之间的对话,例如
function DoGossip(NPC)
// check if NPC1 is close to NPC2
if NPC:DistanceToNpc("SomeGuy") < 10 then
StartConversation1()
end
function StartConversation1(NPC)
NPC:Say("Hello ...")
// wait a moment now trigger NPC2 to reply
????
end
基本上 - 我如何从 lua scriptA 调用一个函数,它存在于 lua scriptB 中,它是 NPC2 的行为脚本。 什么是好的设计?
谢谢
最佳答案
如果您使用 LuaBind,则可以设置一个全局可编写脚本的对象,该对象引用您向脚本公开的游戏引擎周围的包装类。
因此,无论何时设置 lua 引擎,您都可以注册一个您希望所有脚本都可以访问的全局变量,就像在您的 C++ 代码中这样:
luabind::globals(m_pLuaState)["Game"] = m_pGameWrapperClass;
然后,在您的脚本中,您可以简单地引用 Game 对象来获取游戏特定的功能,如下所示:
Game:ScheduleEvent(...)
您的 C++ 游戏包装器类将只实现您将与 LuaBind 绑定(bind)的 ScheduleEvent 函数。您可以根据需要在该对象上添加/注册任意数量的游戏特定功能。
为了引出您的问题 2,您可以简单地在您的 Game 类上注册一个名为 FindNPC() 的函数,它接受一个字符串参数或 id 或在您的引擎中查找 npc 的东西,并返回对它的引用.您可能想围绕 npc 对象编写一个包装类,它公开 npc-y 功能,就像您对 Game 类所做的那样,并且 FindNPC() 将返回代表 NPC 的用户数据,并公开任何必要的功能使用它,或者让它在游戏本身中做一些事情。
关于c++ - Lua/C++/luabind/与其他lua行为脚本交互中成员函数的延迟执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10968746/