我已经多次查看了这个问题,以至于我确信在将LUA集成到我的C++游戏引擎中时,我错过了一大块难题。我想做的是运行我的游戏引擎,然后在它运行时,我想单击我的 UI 并单击"添加脚本",然后运行脚本。这部分很容易做到,但我不明白的是,一个看似与lua_dofile一起运行的脚本如何具有获取鼠标输入或根据输入移动字符的代码。无论如何,我都看不出可以有效地做到这一点。我应该允许每一帧都创建和销毁 LUA 状态,还是让脚本每帧都触发?在这样的应用程序中:
void init();
void update();
void render();
void end();
如何使用 LUA 来控制实体的移动。
假设我设置了 lua 状态,以便您可以像这样编写 lua 代码:
entity1 = Entity.new()
entity1:setPosition(4,5)
如何为脚本提供鼠标输入以将实体移动到鼠标位置?
我的首要问题是,让脚本控制我的实体的最佳方式是什么,如果我为 Lua State 提供移动实体的能力,那么脚本编写者可以编写一个"游戏"(即交互式运行时应用程序(
举一个具体的例子,假设你想在玩家点击鼠标时将球传送给玩家。以下是您可以在Lua中编写的内容:
local function clickHandler(event)
local x, y, z = event.player:getCoords()
local ball = event.world:getBall()
ball:teleportTo(x, y, z)
end
game.registerEventHandler('click', clickHandler)
要使该示例在您的引擎中实际工作,您需要执行以下操作:
- 创建一个
registerEventHandler
函数,将给定的回调保存在 C 可以访问它的地方 - 创建一个返回给定玩家坐标的
getCoords
函数 - 创建一个在游戏世界中获取球的
getBall
函数 - 创建将实体传送到给定位置的
teleportTo
方法 - 每当玩家单击鼠标时,运行您保存的所有
click
事件处理程序,其中包含玩家和游戏世界的event
对象
特别是这个问题:
我应该允许每一帧都创建和销毁 LUA 状态,还是让脚本每帧都触发?
不。在游戏启动时创建一个lua_State
,在其中加载脚本,然后继续使用该状态来调用事件处理程序。
本质上,Lua 脚本定义了在每个事件中调用的函数。因此,主机C++加载脚本,然后进入其主循环并回调 Lua。
看看乐夫是如何做到的。