我已经把这个问题查了很多遍,以至于我确信在把LUA集成到我的C++游戏引擎中时,我错过了一个巨大的难题。我想做的是运行我的游戏引擎,然后当它运行时,我想点击我的用户界面,点击 "添加脚本",然后运行脚本。这一部分很容易做到,但我不明白的是,一个看似与lua_dofile一起运行的脚本,怎么会有获取鼠标输入或根据输入移动角色的代码。我不知道如何有效地做到这一点。我是应该让lua状态每一帧都被创建和销毁,还是让脚本每一帧都开火?在这样的应用程序中。
void init();
void update();
void render();
void end();
我如何使用LUA来控制一个实体的移动呢?
假设我设置了lua状态,所以你可以写这样的lua代码。
entity1 = Entity.new()
entity1:setPosition(4,5)
我如何给脚本提供一些来自鼠标的输入 让实体移动到鼠标的位置?
我的首要问题是,什么是让脚本控制我的实体的最佳方式,如果我向lua状态提供移动我的实体的能力,那么脚本家就可以写一个 "游戏"(即一个交互式的运行时应用程序)。
举个具体的例子,假设你想在玩家点击鼠标时传送一个球给他们。下面是你可以用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。所以主机C++加载脚本,然后进入它的主循环,回调Lua。
看看如何 LÖVE 确实如此。