c++ - Lua/C++/luabind/与其他lua行为脚本交互中成员函数的延迟执行

标签 c++ lua luabind

我有一个带有主循环的游戏 - 在每个循环中,我调用游戏中的每个 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/

相关文章:

c++ - 在 Windows 中构建 Luabind

c++ - 如何在变量中设置浮点精度

c++ - 将 .FLV 文件转换为 MP3

c++ - 有效地在 C++ 类之间传输数据

c++ - Lua SWIG 基础知识

c++ - 当 Lua 绑定(bind)在该类中时,使用 LuaBind 在该类中调用 Lua 函数

c# - Windows 应用程序 - 刚开始

lua - 确定变量是否是 Lua 中的几个值之一

c - lua 5.2.3源码lstring.c函数luaS_resize

python - 嵌入在 C++ 中的 Lua 是否能够拥有持久的局部变量?如果没有,是否有脚本语言可以做到?