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

Delayed execution of member functions in Lua/C++ / luabind / Interaction with other lua behavior scripts

本文关键字:成员 交互 函数 延迟 执行 脚本 luabind C++ 其他 lua Lua      更新时间:2023-10-16

我有一个带有主循环的游戏 - 在每个循环中,我调用游戏中的每个NPC ->ProcessAI()来执行任何操作。 这是一个服务器,因此对 ProcessAI 的调用不会像在客户端游戏上那样在每一帧上执行!它也是单线程的。

现在我想使用 luabind 使用 lua 扩展C++代码库(也许,即使有提升开销)。所以我向LUA公开了我的NPC类的一些函数。

例如,我想创建演员脚本 - 具有更复杂的行为的 Boss 战 - 每当在我的 c++ ProcessAI 函数中发生事件时 - 我会将其委托给特定 NPC 的相应 lua 脚本。

我想象在我的老板.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制定一个演员行为脚本。

现在我想象的是发起两个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 脚本 A 调用函数,该函数存在于 lua scriptB 中,这是 NPC2 的行为脚本。 什么是好的设计?

谢谢

如果使用 LuaBind,则可以设置一个全局可脚本化对象,该对象引用您向脚本公开的游戏引擎周围的包装类。

因此,每当您设置 lua 引擎时,您都可以注册一个您希望所有脚本都有权访问的全局,就像在 C++ 代码中这样:

luabind::globals(m_pLuaState)["Game"] = m_pGameWrapperClass;

然后,在脚本中,您可以简单地引用 Game 对象来获取特定于游戏的功能,如下所示:

Game:ScheduleEvent(...)

您的C++游戏包装类将只实现与LuaBind绑定的ScheduleEvent函数。您可以在该对象上根据需要添加/注册任意数量的游戏特定函数。

为了引出你的问题 2,你可以简单地在你的游戏类上注册一个名为 FindNPC() 的函数,它接受一个字符串参数或 id 或会在引擎中查找 npc 的东西,并返回对它的引用。您可能希望围绕 npc 对象编写一个包装类,该包装类公开 npc-y 功能,就像您对游戏类所做的那样,FindNPC() 将返回表示 NPC 的用户数据,并公开使用它或使其在游戏本身中执行某些操作所需的任何功能。