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

我目前正在使用cocos2d-x和tolua++用C++编写游戏,想利用其将某些功能放在Lua脚本中。最终,我想扩展有多少功能将由脚本控制,但现在我只是尝试为敌人行为编写Lua脚本,这似乎是一个不错的起点。

每个敌人都有一个与之关联的C++ Entity实例。现在,游戏中的每个敌人都在update()上执行其行为计算,但我想改变这一点,使每个敌人都有一个表示其行为的脚本或脚本函数,并在update()上调用它。我得出结论,实现这样做有两种基本方法:

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

  2. 在Lua方面跟踪所有敌人实例,C++方面引用(或实例ID)

我已经找到了如何实现第一种解决方案。以下是我的测试:

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种解决方案似乎更合适,但我无法想出如何实现它。你们觉得呢?

谢谢!

点赞
用户828255
用户828255

如何处理这个问题主要取决于一种所谓的分工。你需要明确并准确地界定谁负责处理什么任务,否则你会在两边重复信息,甚至更糟。尤其要注意,一些逻辑使用 C++ 处理,而另一些逻辑使用 Lua 处理,但现在并不清楚如何划分。

如果可以在 Lua 中实现它们,为什么不在 Lua 中进行跟踪呢?如果你想扩展 Lua 对引擎的控制能力,那就更好了。现在是时候开始移动你的数据和逻辑了。

我认为这个问题出现的原因是,显然,C++ 和 Lua 都可以处理某些事情,但是不清楚应该由哪个处理什么。我提出了以下分工方案,希望你能告诉我你的想法。

C++

  • 图形
  • 音频
  • 网络
  • 需要更高效但无法在 Lua 中改善的函数。

Lua

  • 其他所有事情

总结一下,严格限制使用 C++ 处理 Lua 无法本质地处理的事情,例如与平台有关的功能,如图形,并让 Lua 处理其他的事情。唯一的例外是在引擎中找到一个绝对需要加速的关键点,然后将其卸载到 C++ 上。

可以将 Lua 视为主要语言,其中 C/C++ 库填补空缺。

话虽如此,在组合编写程序时,这可能不是所有需要编写脚本的程序的最佳解决方案,但我认为这是一个不错的游戏引擎案例。

另外,我想分享一下 LuaJIT 开发人员关于 混合 C/C++ 和 Lua 项目中的设计错误牢骚 ,以回应“1.未真正选择一种语言来实现项目(例如两种语言的混合过多)。”这种情况。

2013-11-22 05:16:57