处理输入
响应键盘和鼠标操作。
处理输入 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
读取输入的两种方式
LÖVE 提供两种输入方式。轮询会在每帧询问“此键现在是否按下?”,非常适合移动这类连续操作。
事件是发生某件事时触发一次的回调,例如 love.keypressed,非常适合跳跃或射击这类一次性操作。
轮询键盘
只要某个按键处于按住状态,love.keyboard.isDown(key) 就会返回 true。请在 love.update 中调用它,以获得平滑、连续的响应。
由于它会在每帧进行检查,按住按键就能持续执行操作。这非常适合控制玩家移动。
function love.update(dt)
if love.keyboard.isDown('right') then
player.x = player.x + player.speed * dt
end
end检查多个按键
love.keyboard.isDown 可以同时接受多个按键,只要其中任意一个处于按住状态就会返回 true,这对于设置备用按键非常方便。
您也可以串联多个独立检查,分别处理每个方向,从而实现完整的四向移动。
function love.update(dt)
if love.keyboard.isDown('a', 'left') then
player.x = player.x - player.speed * dt
end
if love.keyboard.isDown('d', 'right') then
player.x = player.x + player.speed * dt
end
endkeypressed 事件
love.keypressed(key) 会在按键按下的瞬间恰好触发一次。请将它用于按住时不应重复执行的操作,例如跳跃或暂停。
引擎会将按键名称作为字符串传入,因此您可以将其与 'space' 或 'escape' 这样的名称进行比较。
function love.keypressed(key)
if key == 'space' then
player.jumping = true
end
end按 Escape 退出
一种常见模式是在玩家按下 Escape 时关闭游戏。love.event.quit 会干净地关闭引擎。
由于 keypressed 每次按下只触发一次,因此可以避免因按住按键而意外重复触发。
function love.keypressed(key)
if key == 'escape' then
love.event.quit()
end
endkeyreleased
love.keyreleased(key) 会在按键松开时触发一次。将它与 keypressed 配合使用,您就可以自行跟踪按键的按住状态。
这对蓄力机制很有用:按下时开始蓄力,松开时发射,并测量按键被按住了多久。
function love.keypressed(key)
if key == 'space' then chargeStart = love.timer.getTime() end
end
function love.keyreleased(key)
if key == 'space' then power = love.timer.getTime() - chargeStart end
end鼠标位置
love.mouse.getPosition 会在 love.update 或 love.draw 中返回光标当前的 x 和 y 坐标。您也可以分别使用 getX 和 getY。
坐标与绘图空间一致:原点位于左上角,y 轴向下递增。
function love.update(dt)
local mx, my = love.mouse.getPosition()
crosshair.x, crosshair.y = mx, my
end鼠标按键
请使用 love.mouse.isDown(1) 轮询按键状态,其中 1 表示左键,2 表示右键,3 表示中键。
若要处理单次点击,请使用事件 love.mousepressed(x, y, button)。它会触发一次,并直接提供点击坐标。
function love.mousepressed(x, y, button)
if button == 1 then
spawnAt(x, y)
end
end文本输入
处理输入文字时,love.textinput(text) 会传递实际字符,并正确处理键盘布局和修饰键。与用于构建文本框的 keypressed 相比,这种方式更合适。
请同时使用 keypressed 处理退格和回车等特殊按键,因为 textinput 不会发送这些按键。
function love.textinput(t)
inputBuffer = inputBuffer .. t
end结合轮询与事件
实际游戏会混合使用这两种方式:在 love.update 中每帧轮询移动按键,而一次性操作则放在事件回调中。
选择正确的方式可以避免错误。在 update 中轮询跳跃会导致按住按键时每帧都触发,而事件只会按预期触发一次。
function love.update(dt)
if love.keyboard.isDown('left') then player.x = player.x - 200*dt end
end
function love.keypressed(key)
if key == 'up' then jump() end
end控制器基础
LÖVE 还通过操纵杆 API 支持控制器。love.joystickpressed 和操纵杆的 isGamepadDown 可以读取按键状态。
模拟摇杆通过 getGamepadAxis 返回 -1 到 1 之间的值,让您能够像使用带有 dt 的键盘轮询一样平滑地调整移动幅度。
function love.update(dt)
if joystick then
local ax = joystick:getGamepadAxis('leftx')
player.x = player.x + ax * player.speed * dt
end
end快速检查
请测试您对 LÖVE 输入处理的理解。
回顾
LÖVE 输入有两种形式:使用 love.keyboard.isDown 和 love.mouse.isDown 轮询连续操作,或对 love.keypressed 和 love.mousepressed 等事件回调做出响应,以处理一次性操作。
鼠标、文本和控制器 API 使输入功能更加完整。选择正确的方式可以让控制响应灵敏并减少错误。
常见问题解答
「处理输入」课时是免费的吗?
是的 — 「处理输入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「处理输入」这节课中我会学到什么?
响应键盘和鼠标操作。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「处理输入」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。