【发布时间】:2013-11-22 13:16:57
【问题描述】:
我目前正在使用 cocos2d-x 用 C++ 编写游戏,cocos2d-x 与 tolua++ 捆绑在一起,所以我想利用它并在 Lua 脚本中提供一些功能。最终我想扩展脚本控制的功能,但现在我只是尝试使用 Lua 脚本来处理敌人的行为,这似乎是一个不错的起点。
每个敌人都有一个与之关联的 C++ 实体实例。就游戏现在而言,每个敌人都会在 update() 上执行其行为计算,但我想更改它,以便每个敌人都有一个表示其行为的脚本或脚本函数,并在 update() 上调用它。我得出的结论是,基本上有两种方法可以做到这一点:
每个行为都有一个全局函数,将敌人实例作为参数传递
使用 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 提供一些接口来查询实时游戏实体怎么样?您可以让它按一些给定的标准过滤以帮助集中查询。