Мой вопрос:
Как я могу обрабатывать игровые состояния в моей системе сущностей, не прибегая к хранению стека игровых состояний?
Таким образом, проект моей системы сущностей означает, что когда сущность должна регистрироваться, например, для событий ввода, компонент ввода вызывает систему ввода и говорит «зарегистрировать эту сущность для этого ввода». Это все хорошо и хорошо, однако, если вы добавите в это понятие игровых состояний (скажем, экран паузы), станет проблемой решить, находится ли сущность в текущем состоянии и должна получить ввод.
Я мог бы дополнить компонент / систему ввода так, чтобы он сказал: «зарегистрируйте эту сущность для этого ввода, находясь в этих состояниях игры», но для этого необходимо, чтобы каждая сущность знала, в каких состояниях она будет использоваться, а это может быть неочевидным. Кроме того, сохранение списка игровых состояний вокруг каждого зарегистрированного входа (и других систем, которые используют обратные вызовы) не кажется слишком эффективным.
Еще одна идея, которая у меня возникла, заключается в том, что будет существовать объект, представляющий игровое состояние, пометить его как отключенный, а затем при генерации входного события проверить, что объект не является потомком отключенного объекта игрового состояния. Кажется, дорого отрабатывать родителя для каждого обратного вызова.
Другая идея состоит в том, чтобы все системы хранили свои данные, привязанные к текущему состоянию, чтобы при создании ввода целевой объект даже не был кандидатом. Однако это действительно вредит способности разрешать связь между сущностями в разных состояниях (не такая уж большая проблема для экранов паузы, но подумайте о взломе замков в Oblivion / Skyrim).
Единственная другая идея, которая у меня возникла, - это заставить все компоненты обрабатывать события изменения состояния и связываться с их соответствующей системой, чтобы отключить все, что они зарегистрировали, и повторно включить его при переключении обратно в это состояние.
Второй (пометить объект как отключенный) и далее (каждый компонент имеет дело с изменениями состояния) кажутся лучшими из моих идей, но ни одна из них не вызывает у меня особого восхищения.
У кого-нибудь есть еще идеи, как это сделать?
редактировать Хотя я и говорю о вводе конкретно в этом вопросе, он может означать любую систему, способную отправлять сообщения / события объектам, такие как коллизии, события таймера и т. д.