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

我已经查找了很多次这个问题,以至于我相信我在将 LUA 集成到我的 C++ 游戏引擎中时漏掉了很重要的一块拼图。我想做的是运行我的游戏引擎,然后在运行时单击我的界面并单击“添加脚本”,然后运行脚本。那部分很容易做到,但我不理解一个似乎在 lua_dofile 中运行的脚本如何具有获取鼠标输入或根据输入移动字符的代码。我看不到任何有效的方法。我应该允许每一帧创建和销毁 LUA 状态,还是让脚本每一帧都触发?在这样的应用程序中:

void init();

void update();
void render();

void end();

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

假设我设置了 lua 状态,这样您可以编写如下的 LUA 代码:


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

如何在脚本中获取鼠标输入,以将实体移动到鼠标位置?

我主要的问题是,最好的方法是什么,可以让脚本在我提供 Lua 状态的情况下控制我的实体,然后脚本编写人员可以编写一个“游戏”(即一个交互式的运行时应用程序)。

点赞
用户7509065
用户7509065

为了举例说明,假设你希望当玩家点击鼠标时,将一个球传送到玩家处。你可以在 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,将脚本加载到其中,然后随后使用该状态调用事件处理程序即可。

2020-05-14 23:41:09
用户107090
用户107090

本质上,Lua脚本定义每个事件要调用的函数。因此,主机C++加载脚本,然后进入其主循环并回调Lua。

看看LÖVE是如何做的。

2020-05-14 23:42:14