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

现在,我想使用luabind使用lua扩展C++代码库(甚至可能增加开销)。因此,我将我的NPC类的某些功能公开给LUA。

例如,我想创建演员脚本-具有更复杂行为的首领之战-每当在我的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拥有一个演员行为脚本。

现在我想像是要在两个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 scriptB中存在的lua scriptA调用函数,它是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的用户数据,并公开所需的任何功能。使用它,或使其在游戏本身中发挥作用。

10-08 09:28
查看更多