Меню, рестарт и экспорт игры
Финальный штрих — это меню, рестарт и экспорт: то, что превращает проект в игру, в которую можно дать поиграть другим.
Суть: переключай сцены через get_tree(), перезапускай уровень одной командой, а готовый билд собирай через меню экспорта.
Игра редко начинается сразу с геймплея. Обычно сначала главное меню с кнопкой «Играть», потом уровень, потом экран конца с «Заново» и «В меню». Всё это — разные сцены, между которыми ты переключаешься. В Godot за смену сцен отвечает дерево игры, доступное через get_tree(). Главные команды: change_scene_to_file(путь) — загрузить другую сцену, reload_current_scene() — перезапустить текущую (идеальный рестарт), quit() — выйти из игры.
extends Control # экран Game Over
func _on_restart_pressed() -> void:
get_tree().paused = false
get_tree().reload_current_scene()
func _on_menu_pressed() -> void:
get_tree().paused = false
get_tree().change_scene_to_file("res://scenes/menu.tscn")Карта сцен игры:
[Меню] --Играть--> [Уровень] --проигрыш--> [Game Over]
^ |
| |
+--В меню------------------------------------+
Заново -> перезапуск [Уровень]Когда игра готова, её нужно экспортировать — собрать в исполняемый файл, который запускается без редактора Godot. Это делается через меню Проект → Экспорт. Один раз скачиваешь экспортные шаблоны (export templates), добавляешь нужную платформу (Windows, Linux, macOS, веб через HTML5, Android) и нажимаешь экспорт. На выходе — файл или папка, которые можно отдать друзьям или выложить на itch.io.
Стоит проникнуться важностью самого факта экспорта. Пока игра живёт только в редакторе, в неё можешь поиграть лишь ты. Экспорт превращает проект в самостоятельный файл, который запускается у любого человека без установки Godot, — и именно в этот момент твоя работа становится настоящей игрой, а не учебным упражнением. Отдать билд другу, выложить на itch.io, показать на школьном проекте — всё это становится возможным. Не откладывай первый экспорт до идеала: собери даже крошечную игру целиком и дай кому-нибудь поиграть. Обратная связь от живого игрока научит большему, чем месяц одиноких правок.
Как работает под капотом
change_scene_to_file выгружает текущую сцену целиком, освобождает её узлы и загружает корень новой сцены на их место. reload_current_scene делает то же самое с тем же файлом — поэтому уровень начинается с чистого листа. При экспорте движок упаковывает все ресурсы игры (сцены, скрипты, картинки, звуки) в один пакет и склеивает его с маленьким «проигрывателем» движка под нужную платформу — получается самостоятельный исполняемый файл.
class Game:
def __init__(self):
self.scene = "menu"
def change_scene(self, name):
print(f"Выгружаю '{self.scene}', загружаю '{name}'")
self.scene = name
def reload(self):
print(f"Перезапуск сцены '{self.scene}' с чистого листа")
game = Game()
game.change_scene("level1") # нажали Играть
game.reload() # проиграли -> Заново
game.change_scene("menu") # вышли в меню
print("Текущая сцена:", game.scene)Та же логика на Python ▶. Игра хранит текущую сцену; смена выгружает старую и грузит новую, а рестарт перезагружает ту же. Именно так устроена навигация между меню, уровнем и экраном конца.
Частые ошибки
Первая ошибка — забыть снять паузу перед сменой сцены: новая сцена грузится, но мир стоит на паузе, и игра кажется зависшей. Снимай paused перед переходом. Вторая — указать неверный путь к сцене: путь начинается с res:// и должен точно совпадать с расположением файла. Третья — пытаться экспортировать без скачанных export templates: движок выдаст ошибку, шаблоны нужно установить один раз. Четвёртая — забыть задать главную сцену проекта (которая запускается первой) — тогда непонятно, с чего начинается игра.
Best practices
Делай меню, уровень и экран конца отдельными сценами и переключай их через get_tree(). Для рестарта используй reload_current_scene() — это проще, чем вручную всё обнулять. Всегда снимай паузу перед сменой сцены. Пути к сценам пиши через res:// и держи сцены в аккуратных папках. Перед экспортом задай главную сцену и установи export templates. Для лёгкой раздачи друзьям удобен веб-экспорт (HTML5) — игра открывается прямо в браузере.
Итоги: меню, уровень и экран конца — это отдельные сцены, между которыми переключаешься через get_tree(): change_scene_to_file для перехода, reload_current_scene для рестарта. Снимай паузу перед сменой и пиши пути через res://. Экспорт упаковывает игру в самостоятельный файл под платформу; нужны export templates и заданная главная сцена. Веб-экспорт удобен для раздачи. Поздравляем — это законченная игра!