Меню, рестарт и экспорт игры

Финальный штрих — это меню, рестарт и экспорт: то, что превращает проект в игру, в которую можно дать поиграть другим.

Суть: переключай сцены через 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 и заданная главная сцена. Веб-экспорт удобен для раздачи. Поздравляем — это законченная игра!

Проверьте себя
1. Какая команда лучше всего подходит для кнопки «Заново» (рестарт уровня)?
Aget_tree().quit()
Bget_tree().reload_current_scene()
Cqueue_free()
DInput.get_vector()
2. Что нужно сделать, чтобы собрать игру в исполняемый файл для друзей?
AПросто отправить папку проекта
BЭкспортировать через Проект → Экспорт, установив export templates и выбрав платформу
CПереименовать главную сцену
DУдалить редактор Godot