1

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

现在我想使用 luabind 用 lua 扩展 C++ 代码库(也许,即使有提升开销)。所以我将我的 NPC 类的一些功能暴露给 LUA。

例如,我想创建演员脚本 - 具有更复杂行为的老板战斗 - 每当在我的 c++ ProcessAI 函数中发生事件时 - 我会将其委托给特定 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 设置一个演员行为脚本。

现在我想象的是在两个 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 的行为脚本。什么是好的设计?

谢谢

4

1 回答 1

1

如果您使用 LuaBind,您可以设置一个全局可编写脚本的对象,该对象引用您公开给脚本的游戏引擎的包装类。

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

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

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

Game:ScheduleEvent(...)

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

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

于 2012-06-10T17:35:07.917 回答