Разработка гибридной игры: Tower Defense и Блэкджек на Godot

Практический курс по созданию уникальной игры, объединяющей стратегию защиты башен с карточной механикой на движке Godot. Вы научитесь проектировать архитектуру игры, работать с 2D-физикой и связывать разрозненные игровые системы в единый цикл.

1. Введение в Godot: Настройка проекта и создание базового интерфейса стола

Введение в Godot: Настройка проекта и создание базового интерфейса стола

Добро пожаловать в курс по разработке гибридной игры! Наша цель — создать уникальный проект, объединяющий стратегическую глубину Tower Defense (защита башни) и азартную механику Блэкджека (21). В этой игре карты будут служить ресурсами для постройки и улучшения башен, а удача при раздаче будет влиять на вашу способность сдерживать волны врагов.

В этой первой статье мы познакомимся с игровым движком Godot, настроим проект и создадим визуальную основу нашей игры — игровой стол.

Почему Godot?

Godot Engine — это бесплатный движок с открытым исходным кодом, который идеально подходит для 2D-игр. Его главная особенность — узловая система (Node system). В Godot всё является узлом: персонаж, звук, кнопка интерфейса и даже сам игровой уровень. Это делает структуру проекта логичной и гибкой.

Основные концепции

Перед тем как открыть редактор, важно усвоить два термина:

  • Узел (Node): Базовый строительный блок. У каждого узла есть имя, свойства и способность выполнять скрипты.
  • Сцена (Scene): Группа узлов, организованная в дерево. Сцена может быть персонажем, меню или целым уровнем. Сцены можно вкладывать друг в друга.
  • !Структура дерева сцены, где родительские узлы содержат дочерние элементы.

    Шаг 1: Создание проекта

    Запустите Godot. В окне менеджера проектов нажмите кнопку New Project (Новый проект).

  • Project Name: Назовите проект, например, BlackjackTD.
  • Project Path: Выберите пустую папку на вашем диске.
  • Renderer: Для 2D-игры выберите Compatibility (ранее OpenGL ES 3). Это обеспечит максимальную совместимость со старыми устройствами и веб-браузерами.
  • Нажмите Create & Edit.
  • Шаг 2: Знакомство с интерфейсом

    Когда редактор откроется, вы увидите рабочее пространство, разделенное на несколько зон:

    * Scene Tree (Дерево сцены): Слева (или справа, в зависимости от настроек). Здесь отображается иерархия узлов текущей сцены. * FileSystem (Файловая система): Внизу слева. Здесь хранятся все ресурсы: скрипты, картинки, звуки. * Viewport (Окно просмотра): Большая область в центре. Здесь вы визуально собираете игру. * Inspector (Инспектор): Справа. Здесь настраиваются свойства выбранного узла (позиция, цвет, текстура).

    !Обзор интерфейса редактора Godot с основными рабочими областями.

    Шаг 3: Настройка базовых параметров

    Наша игра будет сочетать карточное поле и карту для защиты башен. Нам нужно достаточно места на экране.

  • В верхнем меню выберите Project -> Project Settings.
  • Перейдите в раздел Display -> Window.
  • Установите Viewport Width (Ширина) на 1920.
  • Установите Viewport Height (Высота) на 1080.
  • В разделе Stretch установите Mode на canvas_items. Это позволит игре корректно масштабироваться при изменении размера окна.
  • Шаг 4: Создание игрового стола

    Теперь создадим нашу первую сцену. Это будет основной экран игры, где происходит всё действие.

    Корневой узел

  • В панели Scene нажмите кнопку 2D Scene. Это создаст корневой узел типа Node2D.
  • Дважды кликните по имени узла и переименуйте его в MainTable.
  • Нажмите Ctrl + S (или Cmd + S на Mac), чтобы сохранить сцену. Создайте папку Scenes и сохраните файл как MainTable.tscn.
  • > Совет: Хорошая организация файлов критически важна. Сразу создайте папки Scripts, Assets и Scenes в панели FileSystem, чтобы не запутаться в будущем.

    Добавление фона

    Так как у нас есть элементы казино (Блэкджек), сделаем классический зеленый суконный стол.

  • Кликните правой кнопкой мыши на узел MainTable -> Add Child Node (Добавить дочерний узел).
  • В поиске введите ColorRect и выберите его.
  • Выделите новый узел ColorRect.
  • В Инспекторе найдите свойство Color и выберите темно-зеленый цвет (например, Hex: #2d5a27).
  • Чтобы фон покрывал весь экран, в верхней панели вьюпорта нажмите на иконку Anchors (Якоря) и выберите Full Rect (Полный прямоугольник).
  • Теперь у нас есть зеленый стол, готовый к размещению карт и башен.

    Шаг 5: Создание зон интерфейса (UI)

    В Godot для интерфейса используются узлы зеленого цвета, которые наследуются от класса Control. Они умеют автоматически выравниваться и менять размер.

    Слой интерфейса

    Чтобы интерфейс всегда был поверх игровых объектов (башен и врагов), мы используем специальный узел.

  • Добавьте к MainTable дочерний узел CanvasLayer. Назовите его HUD (Heads-Up Display).
  • Все элементы интерфейса мы будем добавлять внутрь HUD.
  • Зона руки игрока

    Нам нужно место, где будут лежать карты игрока. Для этого идеально подойдет контейнер, который автоматически выстраивает элементы в ряд.

  • Нажмите правой кнопкой на HUD -> Add Child Node.
  • Выберите HBoxContainer (Horizontal Box Container). Назовите его PlayerHand.
  • Настроим его положение:
  • * Выберите PlayerHand. * В меню Anchors выберите Bottom Center (Внизу по центру). * В Инспекторе измените Custom Minimum Size (Минимальный размер), задав y (высоту) равной 200. Это зарезервирует место под карты. * Сместите его немного вверх, изменив Position Y или настроив Margin Bottom.

    Зона колоды и дилера

    Аналогично создадим место для колоды.

  • Добавьте к HUD узел Control и назовите его DeckPosition.
  • Разместите его в правом нижнем углу или справа по центру, используя Anchors.
  • Теперь у нас есть структура: * MainTable (Node2D) — мир игры. * ColorRect — фон. * HUD (CanvasLayer) — слой интерфейса. * PlayerHand (HBoxContainer) — место для карт. * DeckPosition (Control) — место для колоды.

    !Итоговая структура сцены и визуальное представление игрового стола.

    Шаг 6: Первый скрипт

    Чтобы оживить игру, нам нужен код. В Godot используется язык GDScript, который очень похож на Python.

  • Выберите корневой узел MainTable.
  • Нажмите иконку свитка с зеленым плюсом (Attach Script) над деревом сцен.
  • Убедитесь, что путь сохранения ведет в папку res://Scripts/ и имя файла MainTable.gd.
  • Нажмите Create.
  • Откроется редактор скриптов. Вы увидите базовый шаблон:

    Давайте разберем, что здесь написано:

    * extends Node2D: Означает, что наш скрипт наследует все возможности стандартного 2D-узла. * func _ready(): Эта функция вызывается один раз, когда сцена полностью загрузилась и появилась в игре. Это идеальное место для начальной настройки (например, перетасовать колоду). * func _process(delta): Эта функция вызывается каждый кадр (обычно 60 раз в секунду). delta — это время, прошедшее с прошлого кадра. Здесь пишут логику движения и обновлений.

    Для проверки работоспособности изменим функцию _ready:

    Запустите игру, нажав кнопку Play (треугольник вверху справа) или клавишу F5. При первом запуске Godot спросит, какую сцену считать главной — выберите Select Current. В нижней панели Output вы увидите наше приветственное сообщение.

    Заключение

    Поздравляю! Вы сделали первый шаг к созданию гибридной игры. Мы настроили проект, разобрались с системой узлов Godot, создали визуальную основу стола и написали первый скрипт.

    В следующей статье мы займемся созданием карты как объекта: научимся программно создавать карты, присваивать им масти и номиналы, а также отображать их в руке игрока.

    2. Реализация механики Блэкджека: скрипты колоды, логика дилера и подсчет очков

    Реализация механики Блэкджека: скрипты колоды, логика дилера и подсчет очков

    В предыдущей статье мы подготовили почву: создали проект в Godot, настроили игровой стол и интерфейс. Теперь пришло время вдохнуть жизнь в нашу игру. Пустой зеленый стол выглядит скучно без карт, а игра не имеет смысла без правил.

    В этой статье мы займемся «мозгами» нашего Блэкджека. Мы создадим объект карты, научимся генерировать колоду из 52 карт, перемешивать её и раздавать игроку, а также напишем алгоритм подсчета очков с учетом хитрой логики Тузов.

    Шаг 1: Создание сцены Карты

    В Godot, чтобы отобразить множество одинаковых объектов (карт), мы создаем одну Сцену (шаблон) и затем создаем её копии (экземпляры) через код.

    Визуальная часть

  • Создайте новую сцену (нажмите + рядом с вкладкой MainTable).
  • В качестве корневого узла выберите Panel. Это узел интерфейса, который имеет фон и рамку. Назовите его Card.
  • В Инспекторе настройте размер:
  • * Layout -> Transform -> Size: x: 100, y: 140 (стандартные пропорции карты). * Custom Minimum Size: также установите 100 на 140. Это важно для того, чтобы контейнеры (HBoxContainer) не сжимали карту до нуля.
  • Добавьте внутрь узла Card дочерний узел Label (для отображения цифры/буквы).
  • Настройте Label:
  • * Напишите в поле Text что-то для теста, например, "A". * В Layout -> Anchors Preset выберите Center (по центру). * В Theme Overrides -> Font Sizes увеличьте размер шрифта до 40.

    !Структура сцены карты в редакторе Godot.

    Скрипт Карты

    Теперь карте нужны данные. Она должна знать, какая она: «Туз Пик» или «Десятка Червей».

  • Прикрепите скрипт к корневому узлу Card. Сохраните его как res://Scripts/Card.gd.
  • Напишите следующий код:
  • Генерация колоды

    Добавим функцию, которая наполняет массив deck. В Блэкджеке: * Карты 2-10 имеют номинал, равный рангу. * Картинки (J, Q, K) стоят 10 очков. * Туз (A) стоит 11 очков (логику превращения в 1 добавим позже).

    > Важно: Функция shuffle() использует генератор случайных чисел. Чтобы при каждом запуске игры порядок был разным, в функции _ready() нужно вызвать randomize() (в Godot 3) или ничего не делать в Godot 4 (там это происходит автоматически), но для надежности можно использовать RandomNumberGenerator.

    Шаг 3: Раздача карт

    Теперь самое интересное — вытащить карту из виртуального массива и положить её на стол.

    Добавим функцию deal_card:

    Обновим _ready(), чтобы проверить работу:

    Запустите игру. Вы должны увидеть две карты внизу экрана. Если вы перезапустите игру, карты должны быть другими.

    !Схема процесса создания карты из данных колоды.

    Шаг 4: Подсчет очков и логика Туза

    Главная сложность Блэкджека — это Туз. Он может давать 11 очков или 1 очко, если сумма перевалила за 21. Это называется «мягкая» и «жесткая» рука.

    Алгоритм подсчета следующий:

  • Считаем сумму всех карт, считая Туз всегда за 11.
  • Считаем количество Тузов в руке.
  • Если сумма больше 21 и у нас есть Тузы, вычитаем 10 из суммы и «сжигаем» один Туз (считаем его за единицу).
  • Повторяем пункт 3, пока сумма > 21 или пока есть Тузы.
  • Реализуем это в MainTable.gd:

    Разбор алгоритма

    Представьте, что у вас рука: Туз, Туз, 9.

  • Изначальный подсчет: .
  • Количество тузов: 2.
  • , вычитаем 10. Счет стал . Тузов осталось 1.
  • не больше . Цикл останавливается.
  • Результат: 21 очко. Это идеальный Блэкджек (или просто 21), где один туз сыграл как 11, а второй как 1.

    Шаг 5: Добавление кнопок управления

    Чтобы играть, нам нужны кнопки «Взять» (Hit) и «Хватит» (Stand).

  • В сцене MainTable, внутри HUD, добавьте VBoxContainer и назовите его Actions.
  • Разместите его справа внизу (над колодой).
  • Внутри Actions добавьте две кнопки Button:
  • * Назовите первую HitButton, текст: "Взять карту". * Назовите вторую StandButton, текст: "Хватит".

    Подключение сигналов

    Теперь нужно связать нажатия кнопок с кодом.

  • Выберите HitButton.
  • В панели Node (справа, вкладка рядом с Inspector) дважды кликните на сигнал pressed().
  • Подтвердите подключение к скрипту MainTable.
  • Повторите то же самое для StandButton.
  • В скрипте появятся две функции. Допишем логику:

    Заключение

    Мы проделали огромную работу! Теперь у нас есть: * Умная колода, которая знает все 52 карты. * Система раздачи, создающая карты на лету. * Математика Блэкджека, корректно обрабатывающая сложные ситуации с Тузами.

    В данный момент игра выводит результаты в консоль (Output). В следующей статье мы свяжем это с нашей Tower Defense механикой: карты станут ресурсами для постройки башен, а выигрыш в Блэкджек будет давать энергию для защиты.

    Готовьтесь, скоро начнется настоящая битва!

    3. Основы Tower Defense: TileMap, навигация врагов и система волн

    Основы Tower Defense: TileMap, навигация врагов и система волн

    В предыдущих статьях мы заложили фундамент нашей карточной механики: у нас есть колода, рука игрока и логика Блэкджека. Но наша игра — это гибрид. Карты нужны не просто для набора очков, а для получения ресурсов, которые мы потратим на защиту от врагов.

    Сегодня мы переходим ко второй половине игры — Tower Defense (защита башни). Мы создадим игровое поле, проложим путь для монстров и научим их наступать волнами.

    Шаг 1: Создание карты с помощью TileMap

    В стратегических играх редко используют отдельные картинки для каждого кустика или участка дороги. Это неэффективно для памяти компьютера. Вместо этого используется технология TileMap (Карта плиток).

    Представьте мозаику. У вас есть набор маленьких квадратных картинок (тайлов): трава, дорога, поворот дороги, вода. Из этих кусочков вы собираете огромный уровень. В Godot узел TileMap (или TileMapLayer в новейших версиях) обрабатывает это автоматически, оптимизируя отрисовку.

    Настройка TileSet

  • Откройте сцену MainTable. Мы будем строить карту прямо на столе, но под интерфейсом.
  • Добавьте узел TileMap как дочерний к MainTable. Убедитесь, что он находится в дереве сцен выше, чем HUD, чтобы интерфейс перекрывал карту, а не наоборот.
  • В Инспекторе найдите свойство Tile Set и выберите New TileSet.
  • Внизу откроется панель TileSet. Сюда нужно перетащить изображение с вашими тайлами (атлас).
  • > Совет: Для прототипа можно использовать простые цветные квадраты 64x64 пикселя, нарисованные в Paint. Один зеленый (трава), один серый (дорога).

  • Настройте Tile Size (размер тайла) в свойствах TileSet, например, 64x64 пикселя.
  • Перейдите на вкладку TileMap (рядом с TileSet в нижней панели), выберите кисть и нарисуйте извилистую дорогу от левого края экрана к правому.
  • !Пример отрисовки уровня с помощью тайлов.

    Шаг 2: Прокладывание пути (Path2D)

    Враги должны знать, куда идти. В жанре Tower Defense враги обычно не ищут путь динамически (как в RTS), а следуют по заранее заданной траектории.

    Для этого в Godot существует идеальная связка узлов: Path2D (Путь) и PathFollow2D (Следование по пути).

  • Добавьте узел Path2D к MainTable. Назовите его EnemyPath.
  • В верхней панели инструментов появятся кнопки управления кривой (зеленая линия с точками).
  • Выберите инструмент Add Point (Добавить точку) и прокликайте центр вашей нарисованной дороги от начала до конца.
  • Теперь у нас есть невидимая рельса, по которой поедут наши враги.

    Шаг 3: Создание врага

    Враг в нашей игре — это не самостоятельный объект, который «ходит» ногами. Технически, это вагончик, который едет по рельсам Path2D.

    Сцена врага

  • Создайте новую сцену.
  • Корневым узлом выберите PathFollow2D. Это критически важно! Именно этот узел умеет прилипать к Path2D.
  • Переименуйте его в Enemy.
  • Добавьте дочерний узел Sprite2D (или AnimatedSprite2D) для визуализации врага. Загрузите текстуру (например, красного круга или монстра).
  • Добавьте Area2D с CollisionShape2D внутри. Это нужно, чтобы в будущем пули башен могли попадать во врага. Настройте форму коллизии под размер спрайта.
  • !Структура сцены врага в Godot.

    Скрипт движения

    Прикрепите скрипт к корневому узлу Enemy (PathFollow2D).

    Чтобы враг двигался, нам нужно менять его свойство progress (прогресс). Это свойство определяет, сколько пикселей прошел объект от начала пути.

    Математика движения описывается простой формулой:

    Где — пройденное расстояние, — скорость движения, а — время.

    В программировании игр мы обновляем позицию каждый кадр, поэтому формула превращается в приращение:

    Сохраните сцену как res://Scenes/Enemy.tscn.

    Шаг 4: Система волн (Spawner)

    Теперь нам нужно создавать этих врагов на уровне. Этим займется скрипт в MainTable.

    Подготовка

    Вернитесь в скрипт MainTable.gd. Нам нужно:

  • Ссылка на сцену врага.
  • Ссылка на путь EnemyPath.
  • Таймер для запуска волн.
  • Добавьте в начало скрипта:

    Логика спавна

    В функции _process мы будем отсчитывать время и создавать врагов.

    Запуск волны

    Теперь создадим функцию, которая начинает волну. Мы можем вызывать её, например, когда игрок нажимает кнопку "Start Wave" (которую вы можете добавить в интерфейс по аналогии с кнопками Блэкджека).

    Для теста добавьте вызов start_wave(5) в конце функции _ready().

    Как это работает вместе?

  • TileMap создает визуальный коридор.
  • Path2D задает математическую кривую поверх этого коридора.
  • Spawner создает экземпляры сцены Enemy.
  • Так как Enemy является узлом PathFollow2D и добавляется внутрь Path2D, движок Godot автоматически привязывает его координаты к кривой.
  • В скрипте врага мы меняем progress, и враг скользит по рельсам к финишу.
  • Заключение

    Мы создали классическую механику движения для Tower Defense. Теперь по вашему столу могут бежать враги, а карты лежат в руке. Чего не хватает? Взаимодействия!

    В следующей статье мы объединим эти миры: мы создадим Башни, которые можно будет строить, используя карты из руки как ресурсы. Мы научим башни стрелять, выбирать цели и останавливать эти бесконечные волны врагов.

    4. Синтез жанров: покупка и улучшение башен за счет побед в картах

    Синтез жанров: покупка и улучшение башен за счет побед в картах

    Мы подошли к самому захватывающему этапу разработки. У нас есть две независимые системы: карточный стол, где можно собрать 21 очко, и поле с дорогой, по которой бегут враги. Но пока они существуют в параллельных вселенных. Игрок может выиграть миллион в карты, но монстры все равно пройдут к финишу.

    В этой статье мы объединим эти миры. Мы превратим очки Блэкджека в Золото, реализуем логику Дилера, создадим боевые Башни и научимся строить их на поле, используя заработанные ресурсы.

    Шаг 1: Завершение цикла Блэкджека

    В прошлой статье мы остановились на кнопке «Хватит» (Stand). Чтобы получить награду, нам нужно определить победителя. Для этого необходимо реализовать ход Дилера.

    Логика Дилера

    В классическом Блэкджеке правила дилера строги: он обязан брать карты, пока сумма его очков меньше 17. Как только сумма достигает 17 или больше, он обязан остановиться.

    Добавим эту логику в MainTable.gd. Нам понадобится контейнер для карт дилера (создайте HBoxContainer с именем DealerHand в HUD, аналогично руке игрока).

    Теперь каждая победа в карты дает ресурсы для войны.

    Шаг 2: Создание Башни

    Башня — это стационарный объект, который обнаруживает врагов и стреляет в них. В Godot для обнаружения идеально подходит узел Area2D.

    Сцена Башни

  • Создайте новую сцену с корневым узлом Node2D (или StaticBody2D). Назовите её Tower.
  • Добавьте Sprite2D с текстурой башни (вид сверху).
  • Добавьте Area2D и назовите его DetectionZone.
  • Внутри DetectionZone добавьте CollisionShape2D. Выберите форму CircleShape2D (круг). Радиус круга — это дальность стрельбы башни (например, 150 пикселей).
  • Добавьте узел Timer (назовите ReloadTimer). Установите Wait Time на 1.0 (один выстрел в секунду) и поставьте галочку Autostart.
  • !Схематичное отображение иерархии узлов в редакторе Godot для сцены башни.

    Скрипт Башни

    Башня должна выбирать цель. Самая простая логика: стрелять в того, кто ближе всего к финишу (имеет наибольший progress на пути).

    !Иллюстрация того, как произвольный клик мышью преобразуется в точное размещение объекта по сетке.

    Шаг 5: Баланс и игровой цикл

    Теперь у нас замкнутый игровой цикл (Core Loop):

  • Фаза карт: Игрок играет в Блэкджек против дилера.
  • Награда: Победа приносит золото.
  • Фаза строительства: Игрок тратит золото на покупку башен.
  • Фаза защиты: Игрок запускает волну врагов (start_wave).
  • Результат: Башни уничтожают врагов. Если враги проходят — игрок теряет жизни.
  • Математика урона

    Чтобы игра была интересной, нужно настроить баланс. Урон в секунду (DPS) башни рассчитывается так:

    Где — урон в секунду, — урон одного выстрела, а — время перезарядки.

    Например, если урон пули , а перезарядка сек, то . Если у врага жизней, башне нужно 5 секунд непрерывной стрельбы, чтобы его убить. Зная скорость врага и длину пути в зоне действия башни, вы можете рассчитать, успеет ли одна башня убить врага или нужно ставить две.

    Заключение

    Поздравляю! Вы создали прототип гибридной игры. Теперь ваши навыки игры в карты напрямую влияют на вашу обороноспособность. Плохая раздача может оставить вас без денег перед сложной волной, а удачный Блэкджек позволит построить непробиваемую оборону.

    В следующей, заключительной статье курса, мы займемся «полировкой»: добавим визуальные эффекты, звуки, главное меню и экран Game Over, чтобы превратить этот прототип в законченный продукт.

    5. Полировка геймплея: визуальные эффекты, баланс и экспорт готовой игры

    Полировка геймплея: визуальные эффекты, баланс и экспорт готовой игры

    Поздравляю! Если вы читаете эту статью, значит, у вас уже есть работающий прототип уникальной игры, объединяющей Блэкджек и Tower Defense. У вас есть карты, башни, враги и экономика. Но будем честны: пока игра выглядит немного «сухой». Враги исчезают без следа, выстрелы беззвучны, а сложность не меняется.

    В этой финальной статье курса мы займемся тем, что разработчики называют «Juice» (сок) — добавлением визуальной и звуковой обратной связи, которая делает игру приятной. Также мы настроим математический баланс сложности и научимся экспортировать проект, чтобы поделиться им с друзьями.

    Шаг 1: Визуальные эффекты (Particles)

    Когда враг погибает, он не должен просто исчезать. Игрок должен чувствовать удовлетворение от уничтожения цели. Для этого в Godot используется система частиц.

    Создание эффекта взрыва

    Для 2D-игр, особенно если мы хотим максимальной совместимости (включая веб-браузеры), лучше использовать узел CPUParticles2D. Он обрабатывается процессором и работает везде.

  • Создайте новую сцену. Корневой узел: CPUParticles2D. Назовите её Explosion.
  • В Инспекторе настройте следующие параметры:
  • * Amount: 15 (количество частиц). * One Shot: On (важно! Эффект должен проиграться один раз и остановиться). * Explosiveness: 1.0 (все частицы вылетают одновременно). * Spread: 180 (разлет во все стороны). * Gravity: (0, 0) (чтобы частицы не падали вниз, если это вид сверху). * Initial Velocity: Min: 50, Max: 100 (скорость разлета). * Scale Amount: Min: 3, Max: 5 (размер частиц, если это пиксели). * Color Ramp: Настройте градиент от желтого к красному и в конце к прозрачному (Alpha = 0).

    !Настройка параметров частиц для создания эффекта взрыва.

    Скрипт самоуничтожения

    Частицы проиграются один раз, но сам узел останется в памяти. Нам нужно удалить его после завершения анимации.

    Прикрепите скрипт к Explosion:

    Подключение к врагу

    Теперь вернемся в скрипт Enemy.gd (из предыдущих уроков) и добавим спавн эффекта при смерти.

    Теперь уничтожение врагов выглядит эффектно!

    Шаг 2: Добавление звука (Audio)

    Звук — это 50% атмосферы. В Godot есть два основных узла для звука:

    * AudioStreamPlayer: Для звуков, которые слышны везде одинаково (музыка, интерфейс). * AudioStreamPlayer2D: Для звуков, имеющих позицию в пространстве (выстрелы, шаги врагов).

    Фоновая музыка

  • В сцене MainTable добавьте узел AudioStreamPlayer. Назовите его MusicPlayer.
  • Перетащите ваш музыкальный файл (формат .ogg предпочтителен для музыки) в поле Stream.
  • Поставьте галочку Autoplay.
  • Звуки выстрелов

  • Откройте сцену Tower.
  • Добавьте AudioStreamPlayer2D.
  • Загрузите короткий звук выстрела (формат .wav лучше для эффектов).
  • В скрипте башни, в момент выстрела, добавьте:
  • Не забудьте связать сигнал от врага или вызывать эту функцию, когда враг доходит до конца пути (в скрипте врага).

    Экран поражения

  • Создайте в HUD новый Control узел GameOverScreen.
  • Сделайте его на весь экран, добавьте полупрозрачный черный фон.
  • Добавьте кнопку RestartButton.
  • Изначально скройте этот экран (глазик в дереве сцен).
  • В скрипте MainTable.gd:

    ``gdscript func game_over(): nHP_nHP_{base}knCount_nnCount_{base}n \cdot 2k=1.2$:

    | Волна | HP Врага | Прирост | | :--- | :--- | :--- | | 1 | 10 | 0% | | 2 | 12 | +20% | | 3 | 14.4 | +44% | | 5 | 20.7 | +107% | | 10 | 51.6 | +416% |

    Как видите, к 10-й волне враги станут в 5 раз сильнее. Это заставит игрока активнее играть в Блэкджек ради улучшений.

    Шаг 5: Экспорт проекта

    Ваша игра готова. Теперь нужно сделать из неё файл .exe (для Windows) или HTML5 (для браузера).

    Установка шаблонов экспорта

    Godot не включает в себя код для экспорта по умолчанию, чтобы быть легким. Вам нужно скачать шаблоны.

  • В меню выберите Editor -> Manage Export Templates.
  • Нажмите Download and Install (выберите версию, соответствующую вашей версии Godot).
  • Настройка экспорта

  • Перейдите в Project -> Export.
  • Нажмите Add... и выберите платформу (например, Windows Desktop).
  • В настройках справа обратите внимание на опции, но для начала можно оставить всё по умолчанию.
  • Нажмите Export Project.
  • Снимите галочку Export With Debug, если хотите финальную версию (она работает быстрее и без консоли отладки).
  • Выберите папку и имя файла (например, BlackjackTD.exe).
  • Нажмите Save.
  • !Меню настройки экспорта проекта под Windows.

    Особенности PCK

    По умолчанию Godot создает два файла: .exe (исполняемый файл) и .pck` (пакет с ресурсами: картинками, скриптами). Оба файла должны лежать в одной папке, чтобы игра запустилась. Если вы хотите один файл, в настройках экспорта включите опцию Embed PCK.

    Заключение курса

    Мы прошли долгий путь от пустого проекта до полноценной гибридной игры. Давайте вспомним, что мы сделали:

  • Настроили Godot и разобрались с узлами.
  • Реализовали Блэкджек: колода, тасовка, логика дилера.
  • Создали Tower Defense: TileMap, навигация врагов, стрельба.
  • Связали жанры: деньги из карт идут на постройку обороны.
  • Отполировали игру: добавили эффекты, звук и баланс.
  • Что дальше?

    Этот проект — отличная база. Вот идеи для развития: * Типы башен: Замедлюящая башня (лед), башня с уроном по площади (ракетница). * Карточные бонусы: Например, масть "Пики" увеличивает урон башен на 10 секунд. * Система улучшений: Тратить золото не только на новые башни, но и на апгрейд существующих.

    Разработка игр — это бесконечный процесс обучения и экспериментов. Не бойтесь ломать код, пробовать новое и создавать свои миры. Удачи в разработке!