Введение в LÖVEПодписка на Комментарии к "Введение в LÖVE"

Аватар xxblx

LÖVE (LOVE2D) - свободный кроссплатформенный фреймворк для создания 2D игр на Lua. Распространяется по лицензии zlib/libpng, а значит может свободно использоваться для создания игр, в том числе и коммерческих.

Скачать фреймворк можно с официального сайта: https://love2d.org/
Пользователи Ubuntu могут загрузить готовые пакеты, а пользователям других дистрибутивов придется скачать исходный код и самостоятельно собрать. Инструкция по сборке есть в вики фреймворка. При наличии установленных необходимых инструментов и зависимостей сборка делается буквально в две команды. Я использую самостоятельно собранный LÖVE версии 0.9.1 в Mageia 4, 32-bit.
В качестве IDE рекомендую использовать ZeroBrane Studio.

Дистрибуция игр

Забегая вперед, хочется сразу сказать, что игры созданные на LÖVE обычно распространяются в .love-файлах, которые являются, по сути, переименованными zip-архивами.
Для создания love-файла нужно перейти в каталог с игрой и создать zip-архив

cd /каталог/с_исходником/игры
zip -9 -q -r SuperGame.love .

В результате, будет создан SuperGame.love, который в свою очередь уже можно запускать через исполняемый файл LÖVE, например:
/usr/bin/love2d /каталог/с_игрой/SuperGame.love

Но если захочется именно отдельный исполняемый файл с игрой, можно сделать, например, так:
cat /usr/bin/love SuperGame.love > SuperGame

Ну и для запуска игры потом, соответственно, потребуется
chmod +x ./SuperGame
./SuperGame

Кстати говоря, Linux-пользователи могут по аналогии и для Windows сделать исполняемый файл
cat love.exe SuperGame.love > SuperGame.exe

Основной файл игры всегда - main.lua, основной конфиг - conf.lua. При запуске игры, неважно указанием исполняемому файлу love2d архива с игрой или запуском заранее собранного отдельного исполняемого файла с игрой, запускаться будет именно main.lua из архива с параметрами из conf.lua.

Hello LÖVE!

По сложившей традиции, начнем с Hello World.
Создаем main.lua со следующим содержимым

function love.draw()
  love.graphics.print("Hello LOVE", 50, 50)
end

В случае с использованием ZeroBrane Studio нужно выбрать love2d из списка интерпретаторов. Для этого нужно выбрать Проект - Lua-интерпретатор - Love2d. При создании нового проекта, нужно устанавливать каталог проекта по редактируемому файлу: Проект - Каталог проекта - Установить по текущему файлу (Project - Project Directory - Set from current file).
В ZeroBrane Studio для запуска нашего main.lua (когда упомянутые выше действия будут выполнены) будет достаточно выбрать Проект - Запуск (Project - Run) или нажать F6. В случае с другими IDE, не заточенными на LÖVE, потребуется вручную создать love-файл и запускать его интерпретатором LÖVE.

Запускаем, появится окно с черным бекграундом и белой надписью в верхнем левом углу.
snimok-untitled-1.png

Базовая структура игры на LÖVE

Любая игра на LÖVE, как правило, включает в себя минимум три основных Callback-функции ("колбека").

function love.load()
  --
end

function love.update(dt)
  --
end

function love.draw()
  --
end
  • love.load() - название говорит за себя. Содержимое этого колбека будет выполнено при запуске игры.
  • love.update() - содержимое этого колбека будет выполняться в непрерывном цикле на протяжении всего выполнения игры. Обратите внимание на dt, это сокращение от Delta Time. Прочитать подробно о том что это такое можно по этой ссылке. В двух словах, dt используется чтобы вне зависимости от "железа" (его "мощности") одни и те же действия у игроков выполнялись с одной скоростью.
  • love.draw() - содержимое этого колбека будет выведено на экран, причем в том порядке, в котором вызывается в колбеке. То есть, в начале колбека резонно рисовать задний фон, а в конце главного героя, иначе, фон будет нарисован поверх героя.

Пример

Нарисуем на экрана красный прямоугольник

function love.load()
  --
end

function love.update(dt)
  --
end

function love.draw()
 
  -- Установим красный цвет
  love.graphics.setColor(255, 0, 0)
  -- Нарисуем прямоугольник
  love.graphics.rectangle("fill", 300, 200, 30, 60)
 
end

snimok-untitled-2.png
Рассмотрим love.graphics.rectangle
  • fill - означает, что прямоугольник нужно закрасить
  • 300 - координата по оси X (отсчет слева направо) левого верхнего угла прямоугольника
  • 200 - координата по оси Y (отсчет сверху вниз) левого верхнего угла прямоугольника
  • 30 - ширина
  • 60 - высота

Для удобства, создадим в love.load отдельную таблицу (назовем, например, block), где будем хранить все свойства нашего прямоугольника

function love.load()
 
  block = {} -- таблица
  block.x = 300 -- координата x
  block.y = 200 -- координата y
  block.w = 30 -- ширина
  block.h = 60 -- высота
 
end

function love.update(dt)
  --
end

function love.draw()
 
  -- Установим красный цвет
  love.graphics.setColor(255, 0, 0)
  -- Нарисуем прямоугольник
  love.graphics.rectangle("fill", block.x, block.y, block.w, block.h)
 
end

А теперь добавим возможность перемещать прямоугольник по экрану
function love.load()
 
  block = {} -- таблица
  block.x = 300 -- координата x
  block.y = 200 -- координата y
  block.w = 30 -- ширина
  block.h = 60 -- высота
 
end

function love.update(dt)
 
  -- Перемещение вверх-вниз
  if (love.keyboard.isDown("up")) then
    block.y = block.y - 100*dt
  elseif (love.keyboard.isDown("down")) then
    block.y = block.y + 100*dt
  end
 
  -- Перемещение влево-вправо
  if (love.keyboard.isDown("left")) then
    block.x = block.x - 100*dt
  elseif (love.keyboard.isDown("right")) then
    block.x = block.x + 100*dt
  end
 
end

function love.draw()
 
  -- Установим красный цвет
  love.graphics.setColor(255, 0, 0)
  -- Нарисуем прямоугольник
  love.graphics.rectangle("fill", block.x, block.y, block.w, block.h)
 
end

Теперь по нажатию стрелок на клавиатуре можно перемещать прямоугольник. Обратите внимание, что перемещение описано в двух if - else. Дело в том, что когда несколько условий, если выполнился первый if, дальше интерпретатор не пойдет проверять выполняются ли остальные elseif'ы, по этому не получится одновременно двигаться сразу, скажем, и вверх, и влево. Решение простое - для направления использовать отдельный if - else, итого получится четыре if - else, но т.к. двигаться одновременно и вверх, и вниз нельзя, резонно разбить на две пары - первая вверх-вниз, вторая - влево-вправо. В таком случае прямоугольник можно перемещать не только строго по четырем направлениям, но и вместе с этим позволить двигаться "по диагонали": влево-вверх, вправо-вверх, вправо-вниз, влево-вниз.

Думаю, для введения написано уже достаточно.

Настоятельно рекомендую к ознакомлению:

Успехов!

Похожие материалы:

Добавить комментарий