
ЖОВТЯК 4016 КУРСОВАЯ
.pdf
4)Задний план
5)Стартовое сообщение
6)Прощальное сообщение
Также, командой было решено добавить дополнительные элементы в игру, а именно:
7)Меню
8)Контейнер с кнопками редактирования персонажа
Движок ―Godot‖ – это Node Tree редактор игр, то есть элементы располагаются на сцене в качестве узлов, которые взаимодействуют между собой. Размещение и создание элементов происходило по ходу создания игры,
поэтому итоговый вариант дерева узлов представлен в последнем пункте. В
игре реализовано две сцены – меню (StartUI) и главная игровая сцена (main).
Реализация начинается с последнего, куда добавляется спрайт с задним фоном игры, который никак не будет меняться.
3.1.Создание персонажа.
Создание персонажа, птички, начинается с создания узла твердого тела
(RigidBody 2D), которое имеет определенный вес, из-за чего при добавлении на главную сцену оно начинает падать вниз под силой тяжести. Далее, к телу добавляется спрайт с текстурой птички во всех вариантах движения (рис.2).
Рисунок 2 – Спрайт игрового персонажа
11

Далее, к игровому персонажу добавляется форма столкновения (Collision Shape 2D), которое в дальнейшем будет использоваться для определения соприкосновения объекты с другими элементами сцены.
Выполнение анимации происходит созданием узла AnimationPlayer. У
игрока будет существовать всего два вида анимации:
1)Анимация полета, которое будет выполняться во время игры
2)Анимация движения на месте, которое будет выполняться перед тем,
как игра началась, т.е. в стартовом положении.
Анимация полета создается следующим образом: рисунок делится на 3
кадра с помощью инструмента Horizontal Frames, в результате чего происходит обрезание спрайта на три части. Теперь в узле AnimationPlayer выполняется создание типа анимации, которое присваивается пользователем – flap. Теперь происходит распределение кадров на определенном промежутке времени. В
моем случае это одна секунда, в которую помещаются frames с помощью инструмента Set Key. Для этого типа анимации выбирается кубическая интерполяция для создания ощущения плавного движения полета птицы.
Результат представлен на рисунке 3.
Рисунок 3 – Создание анимации движения персонажа Далее выполняется создание анимации движения на месте. Аналогично,
как и в предыдущем примере, анимация будет выполняться в течение одной секунды. Чтобы анимация объекта выполняла свое предназначение, объекту будут заданы ключи кадров в позициях: 1 – (0; -5), 2 – (0; 5), 3 – (0; -5).
Анимация будет запускаться сразу после запуска сцены. Таким образом, перед началом игры, игровой персонаж будет выполнять движение вверх-вниз,
которое будет имитировать порхание птицы. Также будет применяться
12

кубическая интерполяция для создания плавности анимации движения.
Результат создания анимации можно увидеть на рисунке 4.
Рисунок 4 – Создание анимации движения на месте Теперь, выполняется написание скрипта для сцены (Приложение А):
1)func _physics_process(_delta)
2)func start()
3)func flap()
4)func die()
Первый метод является основным, который задает физические свойства объекта. В нем проверяется, жив ли объект и задается угловое вращение объекта. По умолчанию объект умеет определенную угловую скорость при движение, то есть порхании объект будет вращаться вокруг своего центра. Но такое движение неестественно, поэтому в этой функции ему задается остановка углового вращение при достижении 90 градусов (при остановке объект будет лететь вниз головой) и при -30 градусах объект будет направлять своѐ движение вверх, поднимаю голову вверх при порхании. Подробную схему угловой скорости можно увидеть на рисунке 5.
13

Рисунок 5 – Направления угловой скорости Второй же метод запускается при начале игры: в этот момент включается
гравитационная величина и анимация полета. И теперь игроку в этот момент требуется начать движения, чтобы персонаж не коснулся земли или труб, что является проигрышем.
Третий метод задает линейную скорость игрового персонажа и включает угловую скорость, направленную против часовой стрелки, которая вызывается нажатием на экран. То есть этот метод является тем описанием движения объекта, который является единственным в игре, задает основную функцию птицы. Так же при вызове метода воспроизводится звук порхания.
Последний метод останавливает движение объекта полностью, если получена переменная, подтверждающая смерть игрового персонажа.
Полностью отключаются линейная и угловая скорости.
Стоит упомянуть, что к объекту bird, добавлены еще два спрайта, которые по умолчанию скрыты. Над этими спрайтами так же надстроены два вида анимации, упомянутые ранее. Предназначение этих спрайтов в том, чтобы заменить изменять внешний вид игрового персонажа, заменяя первый спрайт,
заданный по умолчанию.
14

3.2.Создание игрового барьера, генератора игровых препятствий и
земли.
Теперь создается препятствие для игрового персонажа – трубы, через которые должен он пролететь. Для этого в отдельной сцене создается узел
Node, в который помещается три зоны – зона первой трубы с формой столкновения CollisionBody 2D, зона пролета между трубами, зона второй трубы с формой столкновения CollisionBody 2D. Результат создания труб можно увидеть на рисунке 6.
Рисунок 6 – Создание препятствия Теперь выполняется написание скрипта для этого узла с такими методами
(Приложение Б):
1)func _physics_process(delta)
2)func _on_pipe_body_entered(body)
3)func _on_area_of_score_body_exited(body)
Так как объект препятствие должно двигаться навстречу игроку, то ему задано отрицательное движение. Таким образом, объект движется в сторону игровому персонажа. При этом, если объект выходит за пределы экрана, то он
15
старый объект генерируется новый, который воспроизводит эту же функцию.
При этом старый объект удаляется, чтобы не нагружать оперативную память устройства.
Второй метод выполняется, если какой-либо объект входит в зону труб.
Он проверяет, является ли этот объект игровым персонажем и если это так, то у игрового персонажа выполняется метод «die», что является концом игры.
Третий метод же выполняется, если какой-либо объект в зону пролета между трубами. Он проверяет, является ли этот объект игровым персонажем и если это так, то воспроизводится звуковой сигнал «score», означающий успешное преодоление скорости. Из этого метода посылается сигнал, который в дальнейшем посылает основной сцене сигнал для увеличения количества очков игрока, который является основным показателем результативности в игре.
Теперь, в отдельной сцене создается узел Timer со значением в полторы секунды. Основное предназначение этого узла заключается в том, чтобы менять вертикальное положение труб. Основное предназначение этого действия в том,
чтобы пролет между трубами был разным, и игроку приходилось бы преодолевать препятствия другим способом – либо, взлетая резко вверх,
стремясь попасть на верхний пролет, либо падая вниз, чтобы пройти нижний пролет.
Основными методами этого таймера являются (Приложение В):
1)func _ready()
2)func _on_Timer_timeout()
3)func spawn_barrier()
Первый метод выполняется сразу после начала игры. Он вызывает функцию randomize(), благодаря которой при каждом запуске игры будут заданы случайные числа, задающие координаты препятствия по оси Y.
Благодаря этому, игра не будет казаться однообразной и скучной.
Второй метод выполняется по истечении таймера, то есть при прошествии полутора секунд. В нем же вызывается дочерний объект «barrier»,
16

который был создан ранее. Этому объекту задается величина в пределах определенного значения по оси Y.
Также создается отдельная сцена земли StaticBody 2D. К нему подсоединяется спрайт с текстурой земли, формой столкновения
CollisionBody2D; зона смерти, коснувшись которой игрок погибает; анимацией,
которая будет воспроизводиться до того момента, пока игрок не умрет. В
анимации объект двигается влево и до той же позиции, чтобы анимация земли проходила бесшовно. Объект земли можно увидеть на рисунке 7. Методы этого узла прописаны в основной сцене.
Рисунок 7 - Земля
3.3.Реализация стартового, прощального меню и счетчика очков.
Создается отдельный узел Canvas Layer под названием Menu. Такое меню будет взаимодействовать с игроком при конце и начале игры, что является основным способом взаимодействия игрока с графическим интерфейсом.
В корне этого узла создается два узла типа Control, первый – это Start
сообщение, второе – Game_Over сообщение.
И так, в первом узле содержится стартовое сообщение, в котором написано название игры и предложение начать игру. В этом же узле расположена кнопка MENU, при нажатии на которую игрок возвращается в стартовое меню. Стартовое меню на рисунке 8.
17

Рисунок 8 – Стартовое меню В втором узле реализуется прощальное меню, которое высвечивает
количество очков, набранное во время игры; рекорд очков, который был получен за все игры, пройденные игроком; кнопка Restart, запускающая игровую сцену заново, после которой игру можно начать сначала. Этот узел вызывается при смерти игрока. Прощальное меню на рисунке 9.
Рисунок 9 – Прощальное меню
18

В узле Menu реализован следующий скрипт с такими методами
(Приложение Г):
1)func _input(event)
2)func init_game_over_menu(score, highscore)
3)func _on_Restart_pressed()
4)func _on_GoToMenu_pressed()
Первый метод запускается при определенном событии – начале игры. В
этот момент стартовое сообщение исчезает с определенным значением интерполяции, благодаря которому объект пропадает плавно так же, как и начинается игра. Стоит отметить, что в основной сцене к этому стартовому узлу присоединены узлы с кнопкой выбора типа персонажа, так что все элементы интерфейса при начале игры пропадут.
Второй метод вызывается при окончании игры. Он отображает количество очков и рекорд.
Третий метод вызывается нажатием на кнопку Restart, которая перезапускает игру.
Последний же метод выполняется при нажатии на кнопку Menu на старте,
которая возвращает игрока в главное меню.
Так же одним из элементов интерфейса является – счетчик очков,
созданный в отдельной сцене. Он всегда отображается перед игроком в главной сцене. Он имеет лишь один метод - func change_score(new_score), который получает сигнал от пролета между трубами о прохождении и к счетчику прибавляется одно очко и так далее. Счетчик можно увидеть на рисунке 10.
19

Рисунок 10 – Счетчик
3.4.Создание основной сцены игры, главного меню.
Теперь, когда все элементы игры сделаны, происходит перемещение всех созданных узлов на главную сцену игры. Также в этой сцене были добавлены к объекту Start_Message кнопки смены персонажа с наложенными на них
Label’ами, которые обозначают количество очков, необходимые для разблокировки нового персонажа. Итоговая сцена представлена на рисунке 11.
Рисунок 11 – Главная сцена В этой сцене присутствуют следующие основные методы (Приложение
Д):
1)func _ready() – отображает или убирает Label с кнопок выбора персонажей, загрузка генератора препятствий
2)func new_game() – начало движения препятствий, обнуление
счетчика
3)func player_score() и func set_score(new_score) – увеличение количества очков и его отображение
4)func on_barrier_created(obs) – передача данных о количестве очков от зоны пролета
5)func _on_DeathZone_body_entered(body) – зона смерти земли
6)func game_over() – остановка движения сцены при смерти, проверка
на преодоление рекорда
20