我目前正在使用cocos2d-x编写C ++游戏,它与tolua ++捆绑在一起,因此我想利用它并在Lua脚本中使用一些功能。最后,我想扩展一下脚本将控制多少功能,但是现在我只是试图让Lua脚本用于敌人的行为,这似乎是一个好的起点。
每个敌人都有一个与之关联的C ++实体实例。当游戏现在站立时,每个敌人都会在update()上执行其行为计算,但是我想改变它,以便每个敌人都有一个代表其行为的脚本或脚本函数,并在update()上调用。我得出的结论是,基本上有两种方法可以实现这一目标:
为每个行为设置一个全局函数,将敌方实例作为参数传递
在Lua的一侧跟踪所有敌人实例,并在C ++端使用引用(或实例ID)
我已经研究出如何实施解决方案#1。这是我的考试:
C ++:
lua_getglobal(L, "printNodePosition");
tolua_pushusertype(L, pNode, "CCNode");
lua_call(L, 1, 0);
的Lua:
function printNodePosition(n)
n:setPosition(66, 99)
print ("Node position: " .. n:getPositionX() .. ", " .. n:getPositionY())
end
这很好用,节点位置值按预期变化。但是我觉得这看起来有点像hacky,这可能会导致严重的开销(屏幕上可能有多达50个敌人,每个人都会在每个屏幕上调用脚本)打勾。)
解决方案#2似乎更合适,但我无法弄清楚如何实现它。你们觉得怎么样?
谢谢!
答案 0 :(得分:3)
如果你愿意,你决定如何处理这个问题在很大程度上取决于某种分工。你需要为谁负责什么设置明确而准确的界限,否则你最终会在双方重复信息,或者更糟。 使用C ++处理某些逻辑,但使用Lua处理其他一些逻辑,但不清楚是什么将这两种逻辑分开。
为什么在Lua方面跟踪它们,当他们在Lua中 时?如果你有兴趣扩大Lua对引擎的控制程度,那就更好了。现在是开始转移数据和逻辑的好时机。
我觉得这个问题出现了,因为很明显,C ++和Lua都可以处理这些问题,但是现在还不清楚应该处理什么。我建议以下部门,我希望你能告诉我你的想法。
总结一下,严格限制让C ++处理Lua本身无法做到的事情,比如平台相关的功能,如图形,让Lua处理剩下的事情。唯一的例外是您在引擎中找到了一个关键点,绝对必须加快速度,并将其卸载到C ++。
想象一下,就像Lua是C / C ++库填补空白的主要语言一样。
也就是说,这可能不是所有需要编写脚本的程序的最佳解决方案,但我认为对于您的游戏引擎来说这是一个不错的选择。
除此之外,我想分享由LuaJIT开发人员撰写的关于rant主题的Design mistakes in mixed C/C++ and Lua projects,以回应1. Not truly choosing a language to implement the project in (eg., too much mixing between the 2 languages).