Найти в Дзене
ΩTrueMagic

Проект "Конструктор геймплеев" (часть 2)

Всем привет. Я чуть-чуть переделал логику своего движка. Хочу коротко рассказать об этом. Как было Как я уже писал в предыдущей статье, геймплей работает по принципу стейт-машины. Есть граф состояний. Есть набор игровых параметров. И игра переходит между состояниями вдоль ребер. Каждый переход сопровождается изменениями в игровых параметрах. Как стало Я реализовал идею "вложенных графов". Теперь можно создать несколько, так называемых, контекстов. Каждый контекст это Попадая в определенный узел, движок создает новый контекст. Дальше игра перемещается по состояниям нового графа. Как будто этот граф находится внутри узла предыдущего. Определенные ребра могут "закрывать" контекст. И игра возвращается к узлу, который вызвал этот контекст. Это чем-то похоже на вызов функции. При этом существует возможность "вернуть результат" из функции. Создаваемые контексты складываются в "стек вызовов", а затем удаляются в обратном порядке. Давайте рассмотрим примеры. Пример Hamster Chainsaw (v3) Я
Оглавление

Всем привет. Я чуть-чуть переделал логику своего движка. Хочу коротко рассказать об этом.

Как было

Как я уже писал в предыдущей статье, геймплей работает по принципу стейт-машины. Есть граф состояний. Есть набор игровых параметров.

И игра переходит между состояниями вдоль ребер. Каждый переход сопровождается изменениями в игровых параметрах.

обычный граф
обычный граф

Как стало

Я реализовал идею "вложенных графов".

Теперь можно создать несколько, так называемых, контекстов. Каждый контекст это

  • набор игровых параметров
  • граф, который описывает изменения этих параметров
граф с подграфом
граф с подграфом

Попадая в определенный узел, движок создает новый контекст. Дальше игра перемещается по состояниям нового графа. Как будто этот граф находится внутри узла предыдущего.

Определенные ребра могут "закрывать" контекст. И игра возвращается к узлу, который вызвал этот контекст.

Это чем-то похоже на вызов функции. При этом существует возможность "вернуть результат" из функции. Создаваемые контексты складываются в "стек вызовов", а затем удаляются в обратном порядке.

Давайте рассмотрим примеры.

Пример

Hamster Chainsaw (v3)

Я недавно залил новую версию "Hamster Chainsaw". В этой игре нужно ходить в подземелья и драться с монстрами.

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

граф "Hamster Chainsaw v2"
граф "Hamster Chainsaw v2"

Большой зеленый круг в центре - это стартовая точка (дом). Игрок может сходить в магазин оружия (зеленый кружок слева), либо пойди в одно из трех подземелий (три зеленых кружка справа).

10 красных узлов отвечают за встречу с соответствующим монстром. Из них игрок попадает в синие точки, которые отвечают за бой (ход игрока и ход противника).

Из боя игрок возвращается обратно в центральную точку.

С учетом новой архитектуры я вынес "бой" в отдельный контекст.

граф "HamsterChainsaw v3"
граф "HamsterChainsaw v3"

Попадая в красную точку, создается новый контекст боя, который, как и прежде, состоит всего из двух синих точек.

После завершения боя игрок возвращается обратно в ту красную точку, которая создала контекст боя. А затем из красной точки (вдоль серых стрелок) возвращается в центральную точку (возвращается домой с добычей).

Игра про космос

Игра, которая пока в разработке и без рабочего названия.

Итак, игрок перемещается между планетами, торгует, покупает новые корабли и сражается с пиратами. Все банально.

Главный контекст игры описывает планеты и перемещение игрока между ними.

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

Когда игрок вступает в бой в другим кораблем, запускается контекст "космического боя".

Можно добавить и другие контексты: абордаж, взлом компьютерных систем. Но пока не понятно.

Размышления

Мне очень нравится моя новая механика. Она позволяет не повторять самого себя, и "выносить" общую логику в отдельный подграф.

Вложенность графов не ограничена. При этом "рекурсия" тоже работает (когда контекст вызывает сам себя).

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

Заключение

Спасибо за внимание. Пойду дальше работать над движком. Буду держать вас в курсе :).