【问题标题】:Most efficient way to control a C++ instance through Lua?通过 Lua 控制 C++ 实例的最有效方法?
【发布时间】:2013-11-22 13:16:57
【问题描述】:

我目前正在使用 cocos2d-x 用 C++ 编写游戏,cocos2d-x 与 tolua++ 捆绑在一起,所以我想利用它并在 Lua 脚本中提供一些功能。最终我想扩展脚本控制的功能,但现在我只是尝试使用 Lua 脚本来处理敌人的行为,这似乎是一个不错的起点。

每个敌人都有一个与之关联的 C++ 实体实例。就游戏现在而言,每个敌人都会在 update() 上执行其行为计算,但我想更改它,以便每个敌人都有一个表示其行为的脚本或脚本函数,并在 update() 上调用它。我得出的结论是,基本上有两种方法可以做到这一点:

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

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

我已经想出了如何实施解决方案 #1。这是我的测试:

C++:

lua_getglobal(L, "printNodePosition");
tolua_pushusertype(L, pNode, "CCNode");
lua_call(L, 1, 0);

卢阿:

function printNodePosition(n)
    n:setPosition(66, 99)
    print ("Node position: " .. n:getPositionX() .. ", " .. n:getPositionY())
end

这工作正常,节点位置值按预期更改。但是我不禁觉得这似乎有点 hacky,并且可能会导致严重的开销(屏幕上随时可能有多达 50 个敌人,每个人都会在每个滴答声中调用脚本。 )

解决方案#2 似乎更合适一些,但我不知道如何实现它。大家觉得呢?

谢谢!

【问题讨论】:

  • 您在哪里处理大部分逻辑,它通常在做什么?您是否在做 Lua、C++ 或反之亦然做不到的事情?
  • 大部分都是 C++(现在都是 C++,因为我刚刚开始集成 Lua。)我的计划是向 Lua 公开一些东西(例如敌人的行为,或者可能是脚本电影序列),以便游戏设计师也可以做出贡献,也有助于测试和调整内容,而无需每次都重新编译。
  • 我认为这在一定程度上取决于您的游戏引擎是如何设计的,以及您希望对 lua 进行多少控制。我想您已经在引擎中对某些容量进行了单独的权利跟踪。为 lua 提供一些接口来查询实时游戏实体怎么样?您可以让它按一些给定的标准过滤以帮助集中查询。

标签: c++ lua


【解决方案1】:

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

当他们可以在 Lua 中时,为什么要在 Lua 这边跟踪他们?如果您有兴趣扩大 Lua 对引擎的控制程度,那就更好了。现在是开始迁移数据和逻辑的好时机。

我觉得出现这个问题是因为有些事情 C++ 和 Lua 都可以处理,很明显,但目前还不清楚哪个应该处理什么。我提出以下划分,我希望你告诉我你的想法。

C++

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

Lua

  • 其他一切

总而言之,严格限制让 C++ 处理 Lua 本身无法处理的事情,例如图形等依赖于平台的功能,让 Lua 处理其余的事情。一个例外是您在引擎中发现了一个绝对必须更快的关键点,并将其卸载到 C++。

想象一下,如果 Lua 是 C/C++ 库填补空白的主要语言,本质上。

也就是说,这可能不是所有需要脚本的程序的最佳解决方案,但我认为对于您的游戏引擎来说,这是一个不错的解决方案。


除此之外,我想分享一个LuaJIT的开发者写的Design mistakes in mixed C/C++ and Lua projects主题的rant,以回应1. Not truly choosing a language to implement the project in (eg., too much mixing between the 2 languages).的场景

【讨论】:

  • 喜欢咆哮,有趣的是“我们的游戏将永远不需要脚本”部分是我几个月前的想法。这也是说我对Lua非常陌生,而且我也是这个项目中唯一的程序员,该项目已经迟到了,所以我非常不愿意将我已经在C++中的东西重写为Lua .我还有很多东西要学,所以我可能会让下一个项目更密集地使用 Lua,但是对于这个项目(无论如何这不会是那么大的项目),我想坚持只为一个几件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多