Я пытаюсь создать Entity
для игры, в которой используются шаблоны проектирования компонентов и состояний. Позволь мне объяснить.
Компоненты, составляющие Entity
, будут состоять из InputComponent
, PhysicsComponent
и GraphicsComponent
(на данный момент). Каждый компонент будет иметь свой собственный класс, чтобы поддерживать чистоту и развязку. Таким образом, вы можете реализовать свои собственные компоненты, такие как, например, PlayerInputComponent
для представления ввода игрока, а затем создать Entity
, как это -> Entity player = new Entity(input, physics, graphics)
.
Эта система сама по себе очень хорошо работает для разделения кода, составляющего Entity
. Это делает класс Entity
достаточно гибким, чтобы принимать все различные типы компонентов, допуская множество вариаций. Однако, как указано в вопросе, я также хочу использовать шаблон проектирования State, и я не могу придумать, как заставить их хорошо сосуществовать.
Шаблон проектирования State будет использоваться для представления конечного набора состояний, в которых может находиться Entity
. Например, будут RunningState
, IdleState
, JumpingState
и т. д. Эти состояния смогут обрабатывать ввод и обновлять , решая, когда менять состояния и на какое состояние переходить. Например, если клавиши движения нажаты в IdleState
, IdleState
обработает это и решит переключиться на RunningState
. Это упрощает отслеживание анимации и выделяет логику изменения состояний в отдельный класс, избегая сложных логических операторов.
Мой вопрос: как я могу смешать оба этих шаблона, чтобы они хорошо работали вместе? Мне нужно, чтобы все компоненты имели доступ к этим состояниям, потому что переходы состояний могут происходить в InputComponent
или PhysicsComponent
(на данный момент), и состояния также должны быть доступны в GraphicsComponent
, чтобы я мог нарисовать правильный кадр для текущей анимации. .
Как лучше всего настроить мой класс Entity
, чтобы он мог реализовать оба шаблона и заставить их взаимодействовать друг с другом, не создавая беспорядка в классе Entity
. Спасибо!