Я довольно новичок в разработке игр (но не в программировании), и я пытаюсь выяснить, что было бы лучшим способом справиться с коммуникацией между мирами. Я имею в виду следующее:
Я читал о системах компонентов сущностей (ECS) и о том, как люди предлагают использовать разные миры / пространства ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) для подраздел игры. Например, HUD, инвентарь или бой / движение каждый получает отдельный мир / пространство (потому что они имеют различную графику и основную логику.
Однако мне было интересно, как инвентарь или HUD узнают о здоровье игрока, когда здоровье обрабатывается в другом пространстве / мире, например, в бою?
Это также относится к ходу игры в целом, например, к диалогу с NPC (диалог будет отдельным пространством, так как это всплывающий экран), но как вы будете передавать выбор, сделанный в (или состоянии) диалога, в другие пространства / миры? , Или в основном любые другие типы событий, которые влияют на ход игры в разных пространствах / мирах (здоровье, мана, квесты, диалог, бой, инвентарь, хад и т. Д.)
Как справиться с таким дизайном? Нужен ли ему (в реализации) одноэлементный объект, который содержит всю эту информацию? Это было бы странно, потому что тогда components
нужно было передавать каждое изменение этому одноэлементному объекту, который ощущается как выполнение действий дважды (в отличие от основной СУХОЙ программирования) ...
Я немного растерялся с точки зрения дизайна, какие-нибудь указатели?
---РЕДАКТИРОВАТЬ---
Поэтому я прочитал несколько других постов, предложенных в комментариях, и получил общее представление о возможностях, однако у каждого из них, похоже, есть один существенный недостаток, который делает их просто неправильными. Вполне возможно, что я наблюдаю за деталями, которые могут решить эти недостатки, поэтому не стесняйтесь поправлять меня. Я постараюсь дать обзор, а также некоторые ответы на некоторые вопросы.
Я вижу три основных варианта «обмена» данными между пробелами. Хотя большинство сообщений посвящено обмену данными между системами, я чувствую, что то же самое можно применить к обмену данными между системами.
1. Запросы
Пример : если мир HUD должен знать текущее здоровье игрока, он может запросить другой мир и запросить текущее здоровье.
Недостаток : Миры должны знать друг о друге, что является основной проблемой зависимости и противоречит разделению.
2: Прямой обмен сообщениями (синхронизация и асинхронность)
Пример : если во время боя здоровье игрока меняется, он может отправлять сообщения (синхронизация и асинхронность, что угодно) в другие миры, которым необходимо знать об этом изменении.
Недостаток : все еще проблема развязки: миры должны знать друг о друге.
3: косвенный обмен сообщениями (синхронизация и асинхронность) <- лучший вариант
Пример : если во время боя здоровье игрока меняется, он может отправлять сообщения (синхронизация и асинхронность, что угодно) в общий центр сообщений. Другие миры / системы, которым необходимо знать об этом изменении, подписываются на определенный канал сообщений и читают сообщения.
Верх : полностью отделен, легко управляемый и расширяемый.
Недостаток / неясность : когда канал сообщений узнает, что сообщения должны быть удалены? Или, может быть, система, на которую подписаны, помечает (только для себя) сообщение как прочитанное и ожидает новых сообщений -> окно сообщений через некоторое время становится огромным. Как миры / системы обрабатывают порядок? Например, во время кадра: если HUD уже опрашивал сообщение о работоспособности и после этого состояние меняется, следующий кадр HUD обновляется. Для некоторых приложений это может быть неправильным способом.
Q: один игровой объект может существовать в нескольких местах
Я использую Artemis ECS Framework, который поставляется со встроенными пробелами (называемыми мирами). Каждая сущность (и вместе с ней данные в форме компонентов) создаются в мире и поэтому не могут быть разделены между мирами.