
ЖОВТЯК 4016 КУРСОВАЯ
.pdf
7)func save_highscore() – сохранение рекорда, вызывается при преодолении рекорда
8)func load_highscore() – загрузка рекорда из файла игры
9)func _on_ctchar1_pressed() – смена персонажа
На этом моменте игра готова к использованию. Так же было решено добавить главное меню игры, представляющее игру. Создан узел типа Control,
на которую добавлены иконка игры с еѐ названием, кнопки с переходом в основную сцену игры. Результат представлен на рисунке 12.
Рисунок 12 – Главное меню Скриншот из игры можно просмотреть на рисунке 13.
21

Рисунок 13 – Скриншот игры
В итоге, схема узлов Node в игре составлена таким образом (рис. 13).
Рисунок 13 – Схема узлов
22
ЗАКЛЮЧЕНИЕ
Результатом курсовой работы является реализованная мобильная игра
―Flappy bird‖. В игре реализованы следующие элементы: игровой мир,
персонаж, интерфейс, скрипты к ним. Поверх оригинальной игры реализованы редактор персонажей и главное меню.
В ходе работы изучены движок для создания игр Godot и его язык
GodoScript. В перспективе игра может быть спокойно дополнена дополнительными возможностями.
23
СПИСОК ИСПОЛЬЗОВАННЫХ РЕСУРСОВ
1)Godot Engine Game Development Projects. Build five cross-platform 2D and 3D games with Godot 3.0/Chris Bradfield. - Packt Publishing, 2018 – 294 стр.
2)Официальный сайт Godot : URL - https://godotengine.org/
24
ПРИЛОЖЕНИЕ А
Код файла bird.gd extends RigidBody2D class_name bird
#Константы
var flap_force = -250 var degree = -30 signal died
onready var animator = get_node("AnimationPlayer") onready var hit = get_node("Hit")
onready var wing = get_node("Wing")
var started = false var alive = true
func _physics_process(_delta):
if Input.is_action_just_pressed("flap") and alive: if !started:
start()
flap()
if rotation_degrees <= degree: angular_velocity = 0 rotation_degrees = degree
if linear_velocity.y > 0:
if rotation_degrees <= 90: angular_velocity = 3.0
else: angular_velocity = 0
25
func start():
if started: return started = true gravity_scale = 5.0 animator.play("flap")
func flap():
linear_velocity.y = flap_force angular_velocity = -8.0 wing.play()
func die():
if !alive: return alive = false animator.stop() hit.play() emit_signal("died")
26
ПРИЛОЖЕНИЕ Б
Скрипт создания препятствий barrier.gd extends Node2D
signal score var speed = 220
onready var point = get_node("Point")
func _physics_process(delta): position.x += -speed * delta if global_position.x <= -200:
global_position.x = 500 queue_free()
func _on_pipe_body_entered(body): if body is bird:
if body.has_method("die"): body.die()
func _on_area_of_score_body_exited(body): if body is bird:
point.play() emit_signal("score")
27
ПРИЛОЖЕНИЕ В
Скрипт генерации препятствий barrier_spawner.gd extends Node2D
signal builded_barrier(obs)
onready var timer = get_node("Timer")
var barrier = preload("res://design/barrier.tscn")
func _ready(): randomize()
func _on_Timer_timeout(): spawn_barrier()
func spawn_barrier():
var bar = barrier.instance() add_child(bar)
bar.position.y = randi()%400 + 140 emit_signal("builded_barrier", bar)
func start(): timer.start()
func stop(): timer.stop()
28
ПРИЛОЖЕНИЕ Г
Скрипт стартового и прощального меню Menu.gd extends CanvasLayer
signal start_game
onready var start_message = get_node("Start_text/StartMessage") onready var tween = get_node("Tween")
onready var score_label = get_node("GameOver_text/VBoxContainer/ScoreLabel") onready var high_score = get_node("GameOver_text/VBoxContainer/Highscore") onready var game_over_menu = get_node("GameOver_text")
var game_started = false
func _input(event):
if event.is_action_pressed("flap") and !game_started: emit_signal("start_game")
game_started = true
tween.interpolate_property(start_message, "modulate:a", 1, 0, 0.5) tween.start()
func init_game_over_menu(score, highscore): score_label.text = "SCORE: " + str(score) high_score.text = "HIGHSCORE: " + str(highscore) game_over_menu.visible = true
func _on_Restart_pressed(): get_tree().reload_current_scene()
29
func _on_GoToMenu_pressed():
get_tree().change_scene("res://design/StartUI.tscn")
30