Пользователь
4,8
рейтинг
18 ноября 2013 в 13:38

Разработка → Любовь в пикселях или что такое Love2d из песочницы tutorial

Что же такое Love2d и о чем этот пост? Это кроссплатформенный фреймворк для разработки 2d игр. Почему именно love2d? Потому что это бесплатный, легкий, кроссплатформенный, с открытым исходным кодом, а главное сделанный с любовью движок.


Подготовка

Писать игры на нем можно хоть в блокноте, но я буду использовать Sublime Text 2, так как он прост и гибок. Скачать love можно вот здесь под все популярные десктопные платформы. Запускаем Sublime text и сразу идем в Tools->Build System->New Build System… И пишем туда вот такое:

{
    "selector": "source.lua",
    "cmd": ["c:\\Program Files\\LOVE\\love", "${project_path:${folder}}"]
}

(Если у вас x64 меняем путь к love)

Это для удобства запуска, теперь все, что нужно это нажать Ctrl+B. Создаем папку где мы будем хранить нашу игру. В ней создаем main.lua. В этом файле будет хранится основа нашей игры. А в Sublime text добавляем папку в проект. Все готово. Должно получиться что то вроде этого:

.

Хочу код!

Вся логика будет обновляться в функции love.update(dt), а прорисовка у нас в love.draw(), инициализация происходит love.load(). Поэтому давайте сразу напишем их:

function love.load()
	
end

function love.update(dt)
	
end

function love.draw()

end


Теперь давайте добавим загрузим картинку и сразу ее нарисуем. Картинки загружаются с помощью функции love.graphics.newImage(filename), а рисуются в love.graphics.draw(image, x, y). Добавляем в папку вот эту картинку. И пишем код:

local habrImage, width, height

function love.load()
	habrImage = love.graphics.newImage("habr.png")
	width = love.graphics.getWidth()
	height = love.graphics.getHeight()
end

function love.update(dt)
	
end

function love.draw()
	love.graphics.draw(habrImage, width / 2 - habrImage:getWidth() / 2, height / 2 - habrImage:getHeight() / 2)
end


Ctrl + B и у нас что-то не красивое, давайте подправим и сделаем фон белым. Добавим в начале отрисовки вот такую строчку:

love.graphics.setBackgroundColor(255, 255, 255)


И вот, приятная глазу, картинка.

Это все, конечно круто, но давайте добавим жизни нашей игре и сделаем действия с картинкой, а именно:
— По клавише R картинка будет крутится
— По клавише S картинка будет увеличиваться\уменьшаться
— По клавише M картинка будет двигаться.

Чтобы это реализовать, добавим переменные state (будет отвечать за происходящие), rotation (угол картинки), scale (ее размер), ox, ox (смещение центра картинки) и delta(эта переменная будет отвечать за апдейт переменных). Теперь о инпуте, в love когда клавиша опускается вызывается функция love.keypressed(key, unicode), а при поднятии love.keyreleased(key). Мы будем отслеживать опускание клавиш. Теперь сам код:

local habrImage, width, height, state, rotation, scale, ox, oy, delta

--инициализируем все
function love.load()
	habrImage = love.graphics.newImage("habr.png")
	width = love.graphics.getWidth()
	height = love.graphics.getHeight()
	state = "none"
	resetVariables()
end

--никто не любит писать одно и тоже много раз
function resetVariables()
	rotation = 0
	scale = 1
	ox = 0
	oy = 0
	delta = 1
end

--смотрим что было нажато
function love.keypressed(key, unicode)
	if key == "r" then
		state = "rotation"
		resetVariables()
	elseif key == "s" then
		state = "scalling"
		resetVariables()
	elseif key == "m" then
		state = "moving"
		resetVariables()
	elseif key == "space" then -- чтобы не залипать (:
		state = "none"
		resetVariables()
	end
end

--логика игры
function love.update(dt)
	if state == "rotation" then
		--крутим картинку
		rotation = rotation + delta * dt
	elseif state == "scalling" then
		--увеличиваем
		scale = scale + delta * dt
	elseif state == "moving" then
		--здесь немного посложнее, но все же просто:
		--каждый раз мы увеличивыем дельту
		--а потом берем ее за угол для косинису и синуса
		--и крутим картинку
		delta = delta + delta * dt
		local radius = 50
		ox = radius * math.sin(delta)
		oy = radius * math.cos(delta)
	end
end

--рисуем
function love.draw()
	--рисуем белым
	love.graphics.setBackgroundColor(255, 255, 255)
	--рисуем картинку
	love.graphics.draw(habrImage, width / 2 - habrImage:getWidth() / 2, height / 2 - habrImage:getHeight() / 2, rotation, scale, scale, ox, oy)
end


На этом все, господа. Удачи с созданием игр! Для помощи вот вам вики и офф сайт.

Продолжение.

З.Ы. Это все писалось на 0.8.0.
З.З.Ы. Не забудьте выбрать Build System, чтобы запускать.
Жумиков Егор @yegorf1
карма
24,2
рейтинг 4,8
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (25)

  • +1
    Когда я последний раз его пробовал, он оставил очень двойственные впечатления. С одной стороны очень удобная обертка вокруг SDL. А с другой очень печалит отсутствие нативного средства для реализации UI, организации сцен и т.д. Есть какие-то сторонние решения, но как-то у меня с ними тогда не заладилось. Сейчас с этим как-то ситуация исправилась?
    • 0
      Немного не понял, что вы имеите ввиду. Есть очень много разных библиотек (Список самых самых), нативный код можно использовать в самом lua… Вообще, на форумах можно найти даже реализации 3d. Надеюсь, я ответил на ваш вопрос…
      • 0
        Я думаю подразумевались не библиотеки, а инструменты для подготовки и работы с ресурсами, построением меню, интерфейсов, карт, спрайтов, анимаций и тд и тп
        • 0
          Этого сейчас, к сожалению, нету.
          • 0
            Увы, нет и не будет…
            Love2D — удел энтузиастов, серьёзных игр на нем нет и не будет…
            • 0
              Почему же? Чем вам Mari0 не подходит?
              • 0
                Ну хорошо, одна есть:) А вообще, я же сказал: Love 2D удел энтузиастов и к сожалению таким, по видимому, и останется.
                • 0
                  А я в него верю :p
                  Оффтоп
                  Парень с этой игрой на Gamecon ездил
                  • 0
                    Ну я тоже верил:) Года два...)
                    • 0
                      А вы видели Changelog 0.9.0?
                      • 0
                        Нет, а что там?
                        • 0
                          Масса всего… Что только не обновили, смотрите сами: www.love2d.org/wiki/0.9.0
                          • 0
                            Ну обновили. Ну молодцы:)
                            Хотя добавление ENet радует, в своё время расстался с любовью именно из-за отсутствия нормальной поддержки сети. Нужно будет глянуть после релиза.
                            Хотя моё мнение — Love2D не станет популярным игровым движком, пока не появятся официальные тулзы облегчающие разработку.
                            • 0
                              Ну, если не брать в расчет игровых коммерческих монстров с их движками-комбайнами, такими как юнити3д, анриал енджин и прочие сорс сдк и не рассматривать масштабную коммерческую разработку поставленную на поток и бизнес акул, которые пользуют эти дорогенные технологии с функциями на все случаи жизни, то обычно, и очень часто, часть инструментария создает сам разработчик, а другая часть заменяется уже существующим софтом, возможно с небольшим допиливанием под задачу… И это касается не только геймдева… Правда, может я слишком старомоден..) Да и не знаю что там такого особенного нужно, большая часть необходимых инструментов, причем свободных, есть вне любви, это что касается создания ресурсов (графика, звук, текст/локализация и тп), разве что может понадобиться отдельно упаковка/оптимизация ресурсов, редактор уровней/карт, редактор меню, да и в принципе, по большому счету, все, но это не такая уж и большая проблема и именно это обычно и пишется или затачивается отдельно под задачу в средних и мелких проектах и часто используется повторно на других проектах, все эти редакторы как правило аскетичные и схематичные, а потому простые в реализации, если конечно не рассматривать внутриигровых редакторов уровней, иногда это может быть просто текстовый блокнот… :)
                              • 0
                                Про редактор уровней, кстати, хочу в следующем посте рассказать…
                • 0
                  Ну, как же одна? А вот прям по ссылкам с их же сайта:
                  Concerned Joe
                  Mr. Rescue
                  Not Tetris 2
                  По-моему вполне играбельные играбли… :)
                  Ну, да, он похоже и не на лавры среди гигантов геймдева, но в плане десктопного инди, судя по приведенным же примерам, у него все в порядке…
                  • 0
                    и не претендует*
            • 0
              concernedjoe.com/ посмотрите, на Love2d делают. Очень классная штука )
              • 0
                Ахахах, выглядит весело:)
                Но я все равно не понимаю людей которые выбирают подобные, ммм, «движки». Нужна простота? Возьмите SC или GM. Нужна мощь? С++ и SDL вам помогут! А Love2D — не солоно не сладко…
  • 0
    Приятный фреймворк, я б даже сказал няшный, спасибо за туториал. Игры на нем видел, но сам фреймворк как-то упустил из виду, даже странно, что не натыкался на него ранее, может просто не обратил внимания… Пробежался по коду примера, по вики и даже какое-то эстетическое удовольствие получил от какой-то незамудренности, простоты и легкости фреймворка :) Притом, он вполне себе функционален и самодостаточен, что важно. Возможно даже кодинг под него прокатит как релаксация после суровых серых будней))) Жаль, что под мобильные платформы не катит…
  • 0
    А во что он в итоге компилируется?
    Можно ли публиковать под iOs и Android?
    • 0
      Оно не компилируется, а интерпретируется… Про андроид можно почитать здесь, а про iOS я не смотрел…
    • 0
      Я слоупок, но только сейчас дошел до этого поста :)
      В версии 0.9 используется luajit-2.1, так что можно сравнивать принцип работы с той же java и подобными.
      Да и вообще 0.9 по «фишкам» must have.
      • 0
        Я не стал юзать 0.9.0, т.к. мало про нее знал и не хотел выглядеть как учитель пения на уроке географии (:

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.