0Pricing
Lua Academy · Урок

Обработка ввода

Реагируйте на клавиши и мышь.

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

Событие keypressed

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
end

keyreleased

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 возвращает текущие координаты курсора x и y внутри love.update или love.draw. Также можно использовать отдельно 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 вместе с ним для обработки специальных клавиш, например Backspace и Enter, которые 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 также поддерживает контроллеры через интерфейс джойстика. 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.

Эти возможности дополняют интерфейсы мыши, текста и игрового контроллера. Правильный выбор способа делает управление отзывчивым и избавляет от ошибок.

Часто задаваемые вопросы

Урок «Обработка ввода» бесплатный?

Да — полный текст урока «Обработка ввода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработка ввода»?

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

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

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

Сколько времени занимает урок «Обработка ввода»?

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

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

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

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

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