Я пытаюсь обернуть голову вокруг систем сущности игры и использовать GamePlayKit. я борюсь со следующим сценарием:Должен ли GKEntity иметь свойства или методы доступа к функциям компонента?
RenderComponent
являетсяGKComponent
, который ссылается наSKSpriteNode
, чтобы показать свою сущность.MetaDataComponent
еще один компонент, который содержит различные биты информации об объекте (например, в моем случае, это будет содержать свойства, какMapX
,MapY
...)
У меня есть CharacterEntity
, производные от GKEntity
.
Чтобы инициализировать объект, я передаю имя текстуры, используемой для спрайта. Это позволяет мне создать RenderComponent
.
Для инициализации MetaDataComponent
У меня есть три варианта, и мне интересно, считается ли одна из них лучшей практикой (а также, какая из них - худшая практика)?
- Для каждого свойства в моем компоненте, добавьте параметр к
init()
- Expose свойств в
Character
класса, который будет обновлять свойства компонента. - Передайте объект модели моему объекту и инициализируйте компонент из этого.
Мои мысли:
- Номер 1: Чем больше компонентов моя сущность, тем больше PARAMS я получаю ... это не мое предпочтение.
- Номер 2: сущность должна быть «глупой» и не содержать никаких данных. В самой чистой форме объект - это всего лишь число. Добавление реквизита там «чувствует» неправильно.
- Номер 3: наличие модельного объекта, такого как
MetaData
, мне кажется лучшим, но также избыточным, потому что данные тогда находятся в компоненте и в объекте модели. Может быть, компонент хранит объект модели вместо его свойств?
Чтобы привести другой пример: если я ожидаю, что у объекта будет RenderComponent
, я могу запросить этот компонент и использовать его. Или я мог бы добавить метод к самой сущности, например setRenderPosition
, которая проверяет наличие необходимого компонента и обновляет его. Опять вопрос: есть ли здесь право или не так?
Отличный вопрос. Это «забытая» структура игровых WIP игр Apple, так же, как CAKeyFrameAnimation - это забытое средство анимации на платформах Apple. – Confused