在运行时环境中使用 C++ w/ Lua

Using C++ w/ Lua in a runtime environment

本文关键字:C++ Lua 运行时 环境      更新时间:2023-10-16

我已经多次查看了这个问题,以至于我确信在将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。

看看乐夫是如何做到的。