Составная система шаблон / сущность и традиционное ООП

Я работаю над небольшой игрой, написанной на Java (но вопрос не зависит от языка). Так как я хотел изучить различные шаблоны проектирования, я зациклился на составном шаблоне / системе Entity (о котором я первоначально читал о здесь и здесь ) в качестве альтернатива типичному глубокому иерархическому наследованию.

Теперь, после написания нескольких тысяч строк кода, я немного сбит с толку. Я думаю, что понимаю шаблон, и мне нравится его использовать. Я думаю, что это очень круто и в стиле Starbucks, enter image description here

Мне нравится, как объекты (игровые объекты или как вы их хотите называть) имеют минимальный набор компонентов, и предполагаемая идея состоит в том, что вы могли бы написать код, который выглядит примерно так:

BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();

Alien.addComponent(new Position(), new Movement(), new Render(), new Script(), new Target());
Player.addComponent(new Position(), new Movement(), new Render(), new Script(), new Physics());

.. что было бы действительно хорошо ... но в РЕАЛЬНОСТИ код выглядит примерно так, как

BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();

Alien.addComponent(new Position(), new AlienAIMovement(), new RenderAlien(), new ScriptAlien(), new Target());
Player.addComponent(new Position(), new KeyboardInputMovement(), new RenderPlayer(), new ScriptPlayer(), new PhysicsPlayer());

. Похоже, что у меня есть очень специализированные компоненты, состоящие из меньших компонентов. Часто мне приходится создавать некоторые компоненты, которые зависят от других компонентов. В конце концов, как вы можете рендерить, если у вас нет позиции? Не только это, но и то, как вы закончите рендеринг игрока против пришельца против гранаты, может существенно отличаться. У вас не может быть ОДНОГО компонента, который диктует все три, если только вы не сделаете очень большой компонент (в этом случае ... почему вы все равно используете составной шаблон?)

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

billy.addControllers(new Movement(), new Position(), new CharacterAnimationRender(), new KeyboardCharacterInput());

billy.get(CharacterAnimationRender.class).setBody(BODY.NORMAL_BODY);
billy.get(CharacterAnimationRender.class).setFace(FACE.BLUSH_FACE);
billy.get(CharacterAnimationRender.class).setHair(HAIR.RED_HAIR);
billy.get(CharacterAnimationRender.class).setDress(DRESS.DRAGON_PLATE_ARMOR);

Вышеупомянутый CharacterAnimationRender.class влияет только на то, что отображается ВИЗУАЛЬНО. Поэтому мне явно нужно создать еще один компонент, который обрабатывает статистику снаряжения. Однако зачем мне делать что-то вроде:

billy.addControllers(new CharacterStatistics());

billy.get(CharacterAnimationRender.class).setBody(BODY.NORMAL_BODY);
billy.get(CharacterStatistics.class).setBodyStats(BODY_STATS.NORMAL_BODY);

Когда я могу просто создать контроллер / компонент CharacterGearStuff , который обрабатывает как распределение статистики, так и визуальные изменения?

Итог, я ' Я не уверен, как это должно способствовать повышению производительности, поскольку, если вы не хотите обрабатывать все вручную, вам все равно придется создавать «мета-компоненты» которые зависят от 2+ компонентов (и модифицируют / перекрестно модифицируют все их подкомпоненты - возвращая нас к ООП). Или, может быть, я совершенно неправильно об этом думаю. Я?

18
задан Dave Schweisguth 12 February 2016 в 05:45
поделиться