在运行时环境中使用带有 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是怎么做的。
这个问题我查了很多遍,以至于我确信在将 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是怎么做的。