Разбор проектов на Defold 6. Пауза

Всем привет :waving_hand:
Продолжаем серию разборов чужого кода с этой страницы: Публичный пример Defold .

Сегодня разбираем пример от britzlПауза.
Попробуйте этот проект в действии: запустите пример .
Исходная папка с проектом: ссылка на github .
Исходная папка с публичными примера Defold на github: ссылка на github.

Обращение к новичкам:

Я предполагаю, что у вас уже установлен Defold, если нет, перейдите по этой ссылке: Добро пожаловать в Defold.
Также, будет плюсом, если вы хотя бы поверхностно знакомы со строительными блоками Defold. Если нет, ознакомиться с основными концепциями Defold можно на официальном сайте — перейдите по этой ссылке.6.

Пример того, как скачать и открыть готовый проект:

Скачиваем архив с примерами проектов из github
Распаковываем скачанный ZIP архив примеров в любую папку во вашему усмотрению.
Переходим в папку examples.
Ищем проект play_animation.
Открываем game.project.

Внимание: скриншоты представлены ниже, это пример скачивания и открытия проекта, в этом примере мы рассматриваем пPreformatted textроект с названием play_animation, потому название папок проекта будет отличаться.


Скриншот 3. Открываем разархивированную папку(наименование может отличаться от вашего названия скаченной папки)
Скриншот 4. Открываем папу с примерами.

Разберём структуру проекта:


pause_game.collection — основная загрузочная коллекция.

Содержит в себе:
Игровой объект bg, содержащий компонент sprite. Это игровой объект является неким фоновым изображением. Если фоновое изображение не отображается, то измените значение Z-position игрового объекта bg:

Игровой объект main, содержащий в себе прокси-коллекцию gameproxy и шаблон pause.gui

pause_game.atlas — содержит в себе изображения и анимацию, которая будет использоваться в этом проекте.

bouncing_thing — прототип игрового объекта пришельца. Содержит в себе компонент bounce_script, отвечающий за логику во время игры (прыгает всю игру).

game.collection — содержит в себе игровой объект bouncing_thing.

pause.gui — содержит в себе один box-узел, текстуру для него взятую из атласа.
Texture (текстура) — это набор изображений, подключённый к GUI через Atlas. В атласе ты хранишь все иконки, кнопки, изображения, которые хочешь отрисовать.

В этом файле имеется одна привязка ввода, отвечающая за действие ЛКМ:
image

Рассмотрим bouncing_thing.script:
go.property("delay", 0)
go.property("duration", 0.8)

function init(self)
	go.animate(".", "position.y", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_INQUAD, self.duration, self.delay)
end

go.property("delay", 0)

Создаёт пользовательское свойство delay, которое будет отвечать за задержку проигрывания анимации во время старта анимации. Значение по умолчанию: 0.

go.property("duration", 0.8)

То же самое — свойство для длительности анимации. Значение по умолчанию: 0.8 секунды.

С помощью этих строк кода теперь можно менять эти значения для каждого экземпляра объекта прямо в редакторе:

go.animate(".", "position.y", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_INQUAD, self.duration, self.delay)
Пришелец будет плавно и бесконечно двигаться вверх на 100 пикселей, затем вниз, с указанной скоростью.

Что делает go.animate():

Аргумент Значение Что означает
"." текущий объект Анимируем сам объект
"position.y" компонент позиции по Y Меняем вертикальное положение
go.PLAYBACK_LOOP_PINGPONG режим Анимация туда-сюда (вверх-вниз) бесконечно
100 целевое значение Y-смещение на 100 пикселей
go.EASING_INQUAD кривая ускорения Начинается медленно, ускоряется
self.duration длительность 0.8 секунды (или другое, заданное в редакторе)
self.delay задержка Сколько подождать перед стартом

Может быть полезно: Анимации свойств

Рассмотрим pause.gui_script:

pause.gui_script реализует кнопку паузы в игре через GUI. Когда ты нажимаешь на иконку “паузы”, игра останавливается, повторное нажатие — продолжает игру.

msg.post(".", "acquire_input_focus")

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

msg.post("#gameproxy", "load")

Загружаем коллекцию с игрой через прокси-компонент #gameproxy

self.paused = false

Устанавливаем флаг paused в false (игра не на паузе)

self.pause_node = gui.get_node("pause")

Получаем ноду GUI-кнопки “pause” и сохраняем в self.pause_node
Мы сохраняем GUI-ноду pause в self.pause_node**, чтобы потом удобно и быстро использовать её в других функциях.

if message_id == hash("proxy_loaded") then
	msg.post(sender, "enable")
end

Когда прокси-коллекция #gameproxy загружена, активируем её с помощью "enable".
Пояснение:
После загрузки прокси-коллекции, прокси-коллекция отправит сообщение отправителю, что она загружена. Чтобы активировать прокси-коллекцию, нужно отправить сообщение отправителю: msg.post(sender, "enable").

if action.released and gui.pick_node(self.pause_node, action.x, action.y) then
	self.paused = not self.paused
	if self.paused then
		gui.play_flipbook(self.pause_node, hash("right"))
		msg.post("#gameproxy", "set_time_step", {factor = 0, mode = 1})
	else
		gui.play_flipbook(self.pause_node, hash("pause"))
		msg.post("#gameproxy", "set_time_step", {factor = 1, mode = 1})
	end
end

Если ЛКМ была отпущена и в этот момент находилась на кнопке, то устанавливаем противоположное значение флагу, отвечающему за состояние игры. Было true (поставить на паузу), станет false (снять с паузы).
Если значение флага паузы равно true, то проигрываем другую картинку через play_flipbook. А также, отправляем прокси коллекции сообщение о том, что нужно поставить прокси-коллекцию на паузу (остановить время для коллекции и её объектов, компонентов).
Если значения флага паузы равно false, то проигрываем другую картинку для кнопки и отправляем сообщение прокси-коллекции о том, что нужно снять прокси-коллекцию с паузы.

Останавливает всю игру внутри коллекции-прокси:

  • factor = 0 — время не идёт
  • mode = 1 — применяется ко всей коллекции

Надеюсь, кому-нибудь этот материал будет полезен.
Также я буду рад получить обратную связь, чтобы в дальних постах я смог улучшить качество изложений/объяснений.
Всем спасибо за внимание :light_blue_heart:

Другие разборы:
  1. Разбор проектов на Defold 1.Tilemap Collisions [tilemap]
  2. Разбор проектов на Defold 2. Параллакс [parallax]
  3. Разбор проектов на Defold 3. Движение игровых объектов [animation, movement, input]
  4. Разбор проектов на Defold 4. Воспроизвести анимацию [animation, movement, input]
  5. Разбор проектов на Defold 5. Меню и игра. Прокси-коллекции [proxy-collection, gameloop, collection, gui]
  6. Разбор проектов на Defold 6. Пауза [пауза]
2 Likes