Создание вашей игры
Medusa разделяет контент на три уровня: Данные (ресурсы), Логику (правила) и Представление (ноды на сцене). Чтобы создать работающее древо навыков или интерактивный граф, нужно связать эти элементы воедино.
Tip
Всегда вызывайте await get_tree().process_frame в _ready(), прежде чем работать с графом. Системе нужно время, чтобы проиндексировать все связи.
1) Базы данных и Прогрессия
Система опирается на два типа БД. Это позволяет легко сохранять прогресс игрока, не затрагивая конфигурацию самих навыков.
MedusaDB (Глобальный каталог)
Это «склад» всех доступных в игре элементов.
- Каждому объекту соответствует ресурс AtomData.
- MedusaDB хранит ссылки на эти ресурсы и сопоставляет их с уникальными
id(StringName). - Когда вы добавляете
Atomна граф и назначаете емуAtomData, граф регистрирует этот ресурс в базе.
ProgressDB (Файл сохранения)
Это динамический словарь, который хранит прогресс игрока: id : уровень.
- Если ID навыка есть в этой базе — значит, он разблокирован.
- Метод
progress_db.unlock(id)— это основной способ «покупки» навыка в коде.
Подробней смотрите раздел Data
2) Логика Графа (GraphLogics)
GraphLogic — это мощная система правил, которая автоматически управляет статусом атомов (LOCKED, AVAILABLE, UNLOCKED и т.д.). Вместо того чтобы вручную менять цвет каждой кнопки, вы задаете набор правил для всего Графа.
У Графа есть массив graph_logics. При вызове graph.sync_with_progress(), граф проходит по каждому атому и спрашивает каждое правило: «Можно ли разблокировать этот атом?».
Правила возвращают три типа ответов:
- BLOCK (Запрет): Если хотя бы одно правило вернуло
BLOCK, атом станетDISABLEDили останетсяLOCKED. - ALLOW (Разрешение): Если условие выполнено (например, куплен родительский навык).
- PASS (Нейтрально): Правило не имеет мнения (например, навык не имеет тегов, на которые настроено правило).
Встроенные типы логики:
- ConnectionsLogic: Проверяет наличие открытых связей. В режиме
ANY_PARENTнавык станет доступен, если открыт хотя бы один «предок». - ProgressLogic: Проверяет, не куплен ли навык уже, чтобы перевести его в статус
UNLOCKED. - TagLogic: Позволяет сделать «корневые» навыки (
Root) доступными по умолчанию, просто назначив им соответствующий тег. - BlockLogic: Жестко блокирует ветки, если выполнены определенные условия.
Создание своей логики смотрите GraphLogics
3) Разработка: Динамические и статические графы
Medusa поддерживает два подхода к созданию деревьев:
А. Ручное создание (в Редакторе)
Вы расставляете ноды Atom и GraphBranch в интерфейсе Godot, настраиваете их Connected Paths и визуальные эффекты. Это идеально для небольших, фиксированных деревьев навыков.
Б. Программная генерация (API Графа)
- Спавн Атома:
Используйте
graph.add_atom(atom_node, branch). Это зарегистрирует атом в физической системе графа. - Связывание:
Метод
graph.connect_atoms(parent, child)не просто рисует линию, он создает физическую пружину (SpringForce) между ними и выстраивает логическую иерархию (кто от кого зависит). - Синхронизация:
После любого изменения (добавление связи, удаление атома, покупка навыка) вызывайте
graph.sync_with_progress(progress_db). Это заставляетGraphLogicsмгновенно пересчитать состояния всех нод. - Управление фокусом:
Используйте
graph._focused_atom, чтобы знать, на какой объект нажал пользователь. Это позволяет реализовать «плавающие» панели интерфейса (какctx_panelв демо), которые следуют за выбранным элементом:ctx_panel.global_position = graph._focused_atom.global_position + offset - Массовые операции:
Благодаря
graph._selected_atoms, вы можете связывать или удалять целые группы элементов одним кликом, что ускоряет процесс проектирования.
Подробней смотрите Автоматизацию