通过Lua控制C ++实例的最有效方法?

时间:2013-11-21 16:46:22

标签: c++ lua

我目前正在使用cocos2d-x编写C ++游戏,它与tolua ++捆绑在一起,因此我想利用它并在Lua脚本中使用一些功能。最后,我想扩展一下脚本将控制多少功能,但是现在我只是试图让Lua脚本用于敌人的行为,这似乎是一个好的起点。

每个敌人都有一个与之关联的C ++实体实例。当游戏现在站立时,每个敌人都会在update()上执行其行为计算,但是我想改变它,以便每个敌人都有一个代表其行为的脚本或脚本函数,并在update()上调用。我得出的结论是,基本上有两种方法可以实现这一目标:

  1. 为每个行为设置一个全局函数,将敌方实例作为参数传递

  2. 在Lua的一侧跟踪所有敌人实例,并在C ++端使用引用(或实例ID)

  3. 我已经研究出如何实施解决方案#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似乎更合适,但我无法弄清楚如何实现它。你们觉得怎么样?

    谢谢!

1 个答案:

答案 0 :(得分:3)

如果你愿意,你决定如何处理这个问题在很大程度上取决于某种分工。你需要为谁负责什么设置明确而准确的界限,否则你最终会在双方重复信息,或者更糟。 使用C ++处理某些逻辑,但使用Lua处理其他一些逻辑,但不清楚是什么将这两种逻辑分开。

为什么在Lua方面跟踪它们,当他们在Lua中 时?如果你有兴趣扩大Lua对引擎的控制程度,那就更好了。现在是开始转移数据和逻辑的好时机。

我觉得这个问题出现了,因为很明显,C ++和Lua都可以处理这些问题,但是现在还不清楚应该处理什么。我建议以下部门,我希望你能告诉我你的想法。

C ++

  • 图形
  • 音频
  • 网络
  • 需要更高效但在Lua中无法做得更好的功能。

的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).

的情况