Я работаю над небольшой игрой, написанной на Java (но вопрос не зависит от языка).Поскольку я хотел исследовать различные шаблоны проектирования, я застрял на Composite pattern / Entity system (которую я первоначально прочитал о здесь и здесь ) какальтернатива типичному глубокому иерархическому наследованию.
Теперь, после написания нескольких тысяч строк кода, я немного запутался.Я думаю, что понимаю шаблон и мне нравится его использовать.Я думаю, что это очень круто и Starbucks-иш, но он чувствует, что польза, которую он дает, несколько недолговечна и (что меня больше всего раздражает) сильно зависит от вашей детализации.:
Мне нравится, как объекты (игровые объекты или как вы хотите их называть) имеют минимальный набор компонентов, и логическая идея состоит в том, что вы могли бы написать код, который выглядит примерно так:
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+ компонентов (и модифицировать / перекрестно модифицировать все ихподкомпоненты - возвращая нас к ООП).Или, может быть, я думаю об этом совершенно неправильно.Я?