在运行时环境中使用带有 Lua 的 C++

Using C++ w/ Lua in a runtime environment

这个问题我查了很多遍,以至于我确信在将 LUA 集成到我的 C++ 游戏引擎时,我遗漏了一大块难题。我想做的是 运行 我的游戏引擎,然后在 运行ning 时我想点击我的 ui 然后点击 "add script" 然后 运行剧本。这部分很容易做到,但我不明白的是,看似 运行 与 lua_dofile 就位的脚本如何具有获取鼠标输入或根据输入移动角色的代码。无论如何,我看不到有效地做到这一点。我应该允许在每一帧创建和销毁 LUA 状态,还是让脚本在每一帧都触发?在这样的应用程序中:

void init();

void update();
void render();

void end();

我将如何使用 LUA 来控制实体的移动。

假设我设置了 lua 状态,这样您就可以像这样编写 lua 代码:


entity1 = Entity.new()
entity1:setPosition(4,5)

如何从鼠标向脚本提供一些输入以将实体移动到鼠标位置?

我的首要问题是让脚本控制我的实体的最佳方式是什么,如果我提供 Lua 说明移动我的实体的能力,那么脚本编写者可以编写 "game"(即交互式 运行时间应用程序)

举一个具体的例子,假设你想在玩家点击鼠标时传送一个球给他们。以下是您可以在 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 函数,该函数 returns 给定玩家的坐标
  • 创建一个 getBall 在您的游戏世界中获取球的函数
  • 创建一个 teleportTo 将实体传送到给定位置的方法
  • 每当玩家单击鼠标时,运行 您保存的所有 click 事件处理程序,以及包含玩家和游戏世界的 event 对象

特别是这个问题:

Am I supposed to allow the LUA state to be created and destroyed every frame or do I make the script fire every frame?

没有。您在游戏开始时创建一个 lua_State,在其中加载脚本,然后继续使用该状态来调用事件处理程序。

本质上,Lua 脚本定义了在每个事件中调用的函数。所以主机 C++ 加载脚本,然后进入其主循环并回调 Lua.

看看LÖVE是怎么做的。