0Pricing
Lua Academy · 课时

LOVE 游戏循环

load、update 和 draw。

LOVE 游戏循环 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

什么是 LÖVE

LÖVE(也写作 love2d)是一个免费框架,可以让您使用纯 Lua 构建二维游戏。您编写回调函数,游戏引擎会自动调用它们。

LÖVE 游戏位于一个包含 main.lua 文件的文件夹中。您可以在该文件夹中使用 love . 运行游戏,游戏引擎会启动窗口并开始循环。

三个核心回调

LÖVE 通过您在 main.lua 中定义的三个回调驱动游戏:love.load、love.update 和 love.draw。

您不需要自行调用它们。游戏引擎会调用一次 love.load,然后在游戏运行期间每帧重复调用 love.update 和 love.draw。

function love.load() end
function love.update(dt) end
function love.draw() end

love.load:一次性设置

游戏启动时,love.load 会准确运行一次。请使用它设置状态:加载图像和字体,创建表,并在循环开始前初始化变量。

任何耗时的操作都应放在这里,而不是放在 love.update 或 love.draw 中,这样就不会每帧重复执行。

function love.load()
  player = { x = 100, y = 100, speed = 200 }
  score = 0
end

love.update:游戏逻辑

love.update(dt) 每帧运行一次,用于处理游戏逻辑:移动对象、检查碰撞、更新计时器以及读取输入状态。

dt 参数表示增量时间,即上一帧结束后经过的秒数。您不应在 update 中绘制内容;请将绘制操作放在 love.draw 中。

function love.update(dt)
  player.x = player.x + player.speed * dt
end

dt 为什么重要

不同计算机上的帧率各不相同。如果每帧移动固定的距离,速度较快的计算机会让对象移动得比速度较慢的计算机更快。

乘以 dt 可以让移动与帧率无关。speed * dt 表示“每秒移动 speed 个单位”,因此无论渲染多少帧,对象移动的距离都相同。

-- 200 pixels per second, on any machine
player.x = player.x + 200 * dt

love.draw:渲染

love.draw 会在 love.update 之后每帧运行一次。屏幕上看到的所有内容都在这里使用 love.graphics 模块绘制。

每次绘制调用前,屏幕都会自动清空,因此您需要根据当前游戏状态在每帧重新绘制完整场景。

function love.draw()
  love.graphics.rectangle('fill', player.x, player.y, 32, 32)
end

完整循环

将这些回调组合起来,就得到了一个完整的游戏:load 设置玩家,update 使用 dt 移动玩家,draw 负责渲染玩家。

无论游戏变得多么复杂,这个 load-update-draw 循环都是每个 LÖVE 游戏的心跳。

function love.load() x = 0 end
function love.update(dt) x = x + 100 * dt end
function love.draw()
  love.graphics.circle('fill', x, 150, 20)
end

读取时钟

累加 dt 可以构建计时器。一种常见模式是累加经过的时间,在时间超过阈值时执行操作,然后减去该阈值。

这比计算帧数更可靠,因为帧数取决于硬件,而 dt 跟踪的是真实秒数。

timer = 0
function love.update(dt)
  timer = timer + dt
  if timer >= 1 then
    score = score + 1
    timer = timer - 1
  end
end

love.run 和循环内部机制

在幕后,love.run 才是真正的主循环。它调用一次 love.load,然后无限循环:处理事件、计算 dt、调用您的 update 和 draw,并呈现这一帧。

您很少需要重写 love.run,但了解它的存在有助于理解 dt 和这些回调的来源。

-- simplified idea of love.run
-- love.load()
-- while true do
--   dt = timer.step()
--   love.update(dt)
--   love.draw()
-- end

love.quit 和生命周期

除了三个核心回调之外,LÖVE 还提供其他生命周期回调。当玩家关闭窗口时会触发 love.quit,这样您就可以保存进度。

从 love.quit 返回 true 会取消关闭操作。love.focus 和 love.resize 等其他回调则会响应窗口事件。

function love.quit()
  print('Saving before exit...')
  return false  -- false lets the game close
end

暂停游戏

由于 love.update 驱动所有逻辑,实现暂停很简单:使用一个标志保护游戏逻辑,并在暂停时跳过这些逻辑。

绘制仍会继续运行,因此您可以渲染暂停覆盖层。将更新与绘制分离,正是循环设计如此灵活的原因。

paused = false
function love.update(dt)
  if paused then return end
  player.x = player.x + player.speed * dt
end

快速检查

测试您对 LÖVE 游戏循环的理解。

回顾

LÖVE 通过回调运行游戏:love.load 负责一次性设置,love.update(dt) 每帧处理逻辑,love.draw 每帧进行渲染。

dt 值可以让移动与帧率无关,而 love.quit 等生命周期回调则完善了整个循环。这个循环驱动着每个 love2d 游戏。

常见问题解答

「LOVE 游戏循环」课时是免费的吗?

是的 — 「LOVE 游戏循环」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「LOVE 游戏循环」这节课中我会学到什么?

load、update 和 draw。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「LOVE 游戏循环」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. LOVE 游戏循环
  2. 绘制形状和图像
  3. 处理输入
  4. 移动与碰撞
← 返回 Lua Academy