12. Добавление отчета запуска мяча
Есть узел отвечающий за время, подобный узел можно использовать для создание отчета по времени на какое-либо событие. Мы будем использовать узел «Timer» для задержки выхода мяча, когда мяч вылетел за область экрана. А также мы будем отображать наш таймер на экране, чтобы игрок мог наблюдать время, когда мяч заспавнится. Отчет должен идти от 2, 1, 0 и после должен появиться мяч. Но вы можете и увеличить таймер, все будет завесить от вас.
И так привяжем наш новый узел таймер «Timer» к узлу уровня. После переименуем в «CountdownTimer» таймер обратного отсчета (так дословно переводиться с английского языка, countdown – обратный отсчет, а timer -таймер) В инспекторе узла мы можем увидеть опцию «Wait time» - отвечающая за время ожидание, в нашем случаи здесь указана 1 секунда, поставьте на 2 секунды. Опция «One shot» запрашивает будет ли таймер запускаться снова или нет после просчета времени, если стоит галочка (она же истина - true) то проигрываться будет лишь единожды. Поставьте галочку. Как должен отрабатывать наш узел таймера? Когда мяч вылетает за область экрана, она попадает в левую область или правую области наших узлов «Area2D», и после того как мяч залетает туда, должен запускаться таймер, после его истечение таймер должен испускать сигнал об окончание отчета, а после мяч должен появиться в центре экрана, и игра запускается вновь. У узла таймера есть только один, но очень важный сигнал, сигнал оповещающий истечение времени. Когда время отчета заканчивается срабатывает этот сигнал. Пройдите к сигналам узла таймера и выберете первый и единственный сигнал узла (там есть и другие сигналы, но они передаются по наследству от других узлов) «Timeout». Кликнете по нему два раза и подключите сигнал к нашему уровню. Название функции оставим как есть. Мы подключили сигнал отчета таймера, так же как мы подключали сигналы вхождение в области узлов «Area2D». Какова будет логика: когда мяч попадает в область с левого или правого края, мяч возвращается в середину экрана, и в тот же момент запускается наш таймер. И после того, когда таймер закончится наш мяч должен запуститься. Пока что мы не прикрутим наш таймер к тексту, наша задача влиять на мяч который находиться в собственной сцене из нашего сцены уровня. Но как это сделать? Есть несколько способов как влиять на объекты со собственной сценой, но мы воспользуемся группой. Это еще одна концепция Годота, похожая на сигнал, но с небольшим отличием. Сигналы можно передавать от одного узла к другому, и наоборот. Для группы мы все еще начинаем с одного узла, но можем воздействовать на другие узлы, при чем на столько сколько захотим. Так что любой узел который входит в какую-либо группу может быть нацелен на него. А еще не важно где будет узел, группа узлов можно использовать от куда угодно, даже из другой сцены. Далее мы поместим наш мяч в группу, и затем из сцены уровня нацелиться на группу. А затем эта группа скажет мячу выполнять определенные действия. Вернемся к разработки и перейдем в сцену с мячом, нажав на иконку для перехода в сцену мяча. Теперь выберете мяч и перейдите к инспектору, там выберете узел и найдите вкладку группы. Как мы можем наблюдать, у нас есть кнопка «Управление группами» а еще есть кнопка «Добавить», которая добавляет узел к созданной группы. Давайте ведем название нашей будущий группы «BallGroup» и нажмем кнопку добавить. Когда мы добавим группу, к нашему узлу прикрепиться иконка, указывающая на соответствие группы. А так же появиться надпись самой группы. Теперь мы сможем нацелиться на эту группу, но чтобы был толк, мы добавим функцию в скрипт мяча, нажмите скрипт. Наша функция будет устанавливать скорость мяча на ноль, а так как идет постоянное высчитывание движение в встроенной функции «_physics_process», то умножая направление на нулевую скорость то и направление будет нулевым, иными словами мяч остановиться. Давайте впишем эту функцию. Ну а теперь нам нужно будет находить нашу группу в сцене уровня. Перейдите на сцену уровня, а точнее в скрипт уровня. И теперь мы будет вызывать нашу функцию, в тех областях где мяч пересекает узлы «Area2D». Для этого нам понадобится такие методы. Давайте разбираться с конца команды: метод call_group вызывает группу который записывается первым аргументом, второй аргумент вызывает функцию узла этой группы. Но что значит «get_tree()»? Давайте запустим игру, но перейдем самому редактору при запущенной игре. Мы увидим в дереве сцен две опции «Удаленный» и «Локальный». В удаленной сцене отображаются все текущие элементы игры, нажмите на неё. Вы заметете корневой узел все узлов которые запустились во время игры «root», функция get_tree() позволяет получить доступ ко всем узлам корневого узла «root», а это значит что мы можем обращаться функции таким которые привязаны к группам, что мы не могли бы сделать с определенного узла. Но у нас есть прогресс, заметили, что мяч остановился, когда вылетел за границы экрана, эта действует функция в группе. Запишите такую строчку и на другой области. Вернемся к скрипту мяча, пропишем еще одну функцию которая будет запускать наш мяч. Мы установим скорость, а еще случайным образом снова его запустим. Строчки с случайным запуском направления мяча вы можете скопировать с функции _ready(). Эта функция будет устанавливать скорость мяча и случайным образом направлять его по четырем сторонам. И эту функцию мы тоже будет вызывать с помощью вызова групп. Можете попробовать сами вписать, главное помните, эта функция будет вызываться в сигнале отчета таймера, точнее, когда он заканчивается, в скрипте уровня сцены. Но теперь пара запустить и сам таймер, когда мяч уходит за границу, мы должны вызвать узел таймера и запустить обратный отсчет. Вписываем наш узел таймера через знак «$» далее название узла и после вызываем метод «.start()» Не забудьте и в другой области прописать вызов таймера. И теперь должно сработать. Запустите игру, когда мяч вылетит за границы экрана, он вернётся в середину экрана, а после 2 секунд запуститься снова. И так мы существенно добавили кода в наш скрипт узла уровня. И если заметить, то мы дублируем код в двух местах, что не совсем является хорошо. Мы можем поместить дублирующий код в свою собственную функцию, что же давайте это и сделаем, спуститесь ниже функции отчета таймера и создайте функцию ball_launch() «Запуск мяча» - функция которая будет устанавливать позицию мяча в центре экрана и запускать таймер отсчета таймера. А теперь скопируйте дублирующий код, кроме подсчета очков. А далее удалите дублирующий код и поместите там функцию ball_launch(). Наш код существенно сократился, после каждого подсчета очков будет запускаться функция ball_launch(), которая будет устанавливать наш мяч в середину экрана и запускать таймер. А теперь мы отобразим наш счет на экране. И мы снова воспользуемся простым узлом для отображение текста «Label». Перейдите к узлу уровня и прикрепите узел «Label» Переменяем его в CountdownLabel (ярлык обратного отсчета), далее переместите к другим узлам пользовательского интерфейса. Так как элементы игры по умолчанию отображаются чем ниже в дереве сцен, тем ближе к игроку, и было бы странно если бы текст перекрывал сам мяч во время полета (хотя тут уже зависит от самого разработчика, как отображать тот или иной элемент). И снова в макете текста устанавливаем «Полный прямоугольник», дабы заполнить область поля текста на весь экран. А в самом узле в тексте укажем «Countdown» (обратный отсчет), для отображение текста на экране и указание вне игры что за элемент находиться. Далее разместите текст по центру используя опции Align и Valing. Задерем наш отсчет вверх через опции Margin, воспользуемся верхом «top» установим примерно в -300 единиц. Далее вам нужно будет добавить свой динамический шрифт, как это делается было рассказано выше, в предыдущем разделе. А теперь подключим наш узел текста к таймеру, а точнее к отсчету таймера. Мы так же будем размещать отображение текста в функции _process. Обратимся к узлу «CountdownLabel» через знак «$», к методу «text». Мы будем помещать туда остаток времени от таймера, за эту процедуру отвечает метод «time_left». Правда если мы запустим игру, то выдаст ошибку. Это связанно с тем что мы пытаемся вывести числовое значение в строке. Но чтобы наши данные преобразовать в текст воспользуемся методом «str» который преобразует данные в текст. Есть еще одна проблема, но это вы обнаружите если запустите игру, запустите. Таймер использует число с плавающий запятой, иными словами дроби. Поэтому на экране отображаются многочисленные числа с точкой. Дроби можно преобразовать в целые числа, правда остаток будет откидываться… визуально, для преобразование текста в целые числа или дроби в целые числа нам понадобиться функция int(). Оберните еще раз наш узел в эту функцию. Теперь если вы запустите игру и после запуска таймера, он будет начинаться с единицы, это легко поправляется добавление единицы к нашему остатку таймера. Еще хорошо бы скрыть наш текст таймера после завершение отсчета. Так что давайте это и сделаем. Когда наш таймер заканчивается мы скрываем текст, отображающий остаток времени. Обратимся к нашему узлу и к методу видимости. У текста есть метод отвечающий за его видимость, взгляните в инспектор узла «Label», там есть опция Visible. Если этот метод будет ложь, то отображение выключиться, а если истина, то включиться. Мы сталкиваемся с еще одним типом данных, булевое выражение где ложь это false, а истина true. Да и выключите видимость текста отсчета в инспекторе, чтобы при запуске не отображать текст. Когда будет visible установлен в false, текст не будет отображаться, а если будет значение true, то будет отображаться. Так же мы будем включать видимость текста обратного отсчета при удаления мяча за экран. Чтобы потом прокручивать таймер снова. Теперь если вы запустите игры, таймер не будет отображаться пока мяч не вылетит за экран, а после будет идти отсчет со второй секунды, и после таймер будет исчезать, а мяч запускаться. На этом раздел окончен, далее останется заключительный раздел в которым мы установим звуковые эффекты, для полноценной игры. | |
| |
Просмотров: 58 | |
Всего комментариев: 0 | |
| |