我有一个带有主循环的游戏 - 在每个循环中我呼叫游戏中的每个NPC - > ProcessAI()来执行任何动作。 这是一个服务器,因此对客户端游戏的每一帧都不会执行对ProcessAI的调用!它也是单线程的。
现在我想用lua使用luabind扩展C ++代码库(也许,即使有提升开销)。所以我将我的NPC类的一些函数暴露给LUA。
我想创建演员脚本例如 - 具有更复杂行为的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应该是一些C ++函数导出到Lua - 但是用这个来保持NPC(boss)的对象引用并调用函数的最佳方法是什么在大约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的行为脚本。 什么是好的设计?
由于
答案 0 :(得分: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的userdata,并公开所需的任何功能。使用它,或者让它在游戏本身中完成。