Всем привет
Продолжаем серию разборов чужого кода с этой страницы: Публичный пример Defold .
Сегодня разбираем пример от britzl — Пауза.
Попробуйте этот проект в действии: запустите пример .
Исходная папка с проектом: ссылка на github .
Исходная папка с публичными примера Defold на github: ссылка на github.
Обращение к новичкам:
Я предполагаю, что у вас уже установлен Defold, если нет, перейдите по этой ссылке: Добро пожаловать в Defold.
Также, будет плюсом, если вы хотя бы поверхностно знакомы со строительными блоками Defold. Если нет, ознакомиться с основными концепциями Defold можно на официальном сайте — перейдите по этой ссылке.6.
Пример того, как скачать и открыть готовый проект:
Скачиваем архив с примерами проектов из github
Распаковываем скачанный ZIP архив примеров в любую папку во вашему усмотрению.
Переходим в папку examples
.
Ищем проект play_animation
.
Открываем game.project
.
Внимание: скриншоты представлены ниже, это пример скачивания и открытия проекта, в этом примере мы рассматриваем п
Preformatted text
роект с названием play_animation, потому название папок проекта будет отличаться.


Разберём структуру проекта:
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. В атласе ты хранишь все иконки, кнопки, изображения, которые хочешь отрисовать.
В этом файле имеется одна привязка ввода, отвечающая за действие ЛКМ:
Рассмотрим 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
— применяется ко всей коллекции
Надеюсь, кому-нибудь этот материал будет полезен.
Также я буду рад получить обратную связь, чтобы в дальних постах я смог улучшить качество изложений/объяснений.
Всем спасибо за внимание
Другие разборы:
- Разбор проектов на Defold 1.Tilemap Collisions [tilemap]
- Разбор проектов на Defold 2. Параллакс [parallax]
- Разбор проектов на Defold 3. Движение игровых объектов [animation, movement, input]
- Разбор проектов на Defold 4. Воспроизвести анимацию [animation, movement, input]
- Разбор проектов на Defold 5. Меню и игра. Прокси-коллекции [proxy-collection, gameloop, collection, gui]
- Разбор проектов на Defold 6. Пауза [пауза]