0Pricing
Lua Academy · Урок

Игровой цикл LOVE

load, update и draw.

«Игровой цикл LOVE» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 означает «единицы скорости в секунду», поэтому объект проходит одинаковое расстояние независимо от количества отображённых кадров.

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

love.draw: отрисовка

love.draw выполняется один раз за кадр после love.update. Всё, что Вы видите на экране, рисуется здесь с помощью модуля love.graphics.

Экран автоматически очищается перед каждым вызовом draw, поэтому на каждом кадре Вы заново отрисовываете всю сцену на основе текущего состояния игры.

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

Полный цикл целиком

Объединив функции обратного вызова, Вы получаете полноценную игру: load настраивает игрока, update перемещает его с помощью dt, а 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 срабатывает, когда игрок закрывает окно, и позволяет сохранить прогресс.

Возврат значения true из love.quit отменяет закрытие. Другие функции обратного вызова, такие как 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» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Игровой цикл LOVE»?

load, update и draw. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Игровой цикл LOVE»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Игровой цикл LOVE
  2. Отрисовка фигур и изображений
  3. Обработка ввода
  4. Движение и столкновения
← Назад к Lua Academy