首页 > 解决方案 > 在运行时环境中使用带有 Lua 的 C++

问题描述

我已经多次查看这个问题,以至于我确信在将 LUA 集成到我的 C++ 游戏引擎时,我错过了一个巨大的难题。我想要做的是运行我的游戏引擎,然后在它运行时我想点击我的 ui 并点击“添加脚本”,然后运行脚本。这部分很容易做到,但我不明白的是,看似使用 lua_dofile 运行的脚本如何具有获取鼠标输入或根据输入移动字符的代码。无论如何,我看不到有效地做到这一点。我应该允许每帧创建和销毁 LUA 状态还是让脚本每帧触发?在这样的应用程序中:

void init();

void update();
void render();

void end();

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

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


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

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

我的首要问题是让脚本控制我的实体的最佳方式是什么

标签: c++luagame-enginegame-development

解决方案


举一个具体的例子,假设你想在玩家点击鼠标时将球传送给他们。以下是您可以在 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,在其中加载脚本,然后继续使用该状态来调用事件处理程序。


推荐阅读