Эффективное общение в компонентной системе - PullRequest
2 голосов
/ 12 мая 2010

Да, это еще один вопрос о моем игровом движке, который очень хорошо подходит , большое спасибо вам, ребята.

Итак, если вы смотрели видео (или не смотрели), объекты в игре состоят из различных компонентов, таких как положение, спрайты, движение, столкновение, звуки, здоровье и т. Д. У меня определено несколько типов сообщений для связи типа «сказать» между сущностями и компонентами, но это еще далеко. Есть много раз, когда мне просто нужно что-то спросить, например, о позиции организации.

В моем коде есть десятки строк, которые выглядят так:

SomeComponent comp = (SomeComponent)entity.GetComponent(typeof(SomeComponent));
if (comp != null) comp.GetSomething();

Я знаю, что это очень уродливо, и я знаю, что отливка пахнет неправильным ОО-дизайном. Но, как бы ни были сложны вещи, лучшего пути не существует. Я мог бы, конечно, «жестко закодировать» мои типы компонентов и просто иметь

SomeComponent comp = entity.GetSomeComponent();

но это похоже на отговорку и плохую.

Я буквально только что ПОНЯЛ, когда писал это, после того как мой код был таким образом месяцами без решения, что универсальный поможет мне.

SomeComponent comp = entity.GetComponent<SomeComponent>();

Удивительно, как это работает. Во всяком случае, это все еще только семантическое улучшение. Мои вопросы остаются.

  1. Это действительно так плохо?
  2. Какая альтернатива лучше?

Ответы [ 3 ]

0 голосов
/ 31 июля 2010

Я работаю над игрой и использую параметры универсального типа для одинакового поиска различных компонентов. Я поняла от http://t -machine.org / index.php / 2010/05/09 / юридическое лицо-система-1-javaandroid / . Я не уверен, что это лучший способ, это похоже на неправильное использование системы генериков. Это работает, хотя.

0 голосов
/ 02 февраля 2011

Почему вы думаете, что это плохо?

Это то, для чего были созданы дженерики.

0 голосов
/ 12 мая 2010

Не зная общего дизайна вашей игры, трудно понять, хорош или плох тот шаблон в отдельности. Если это работает и работает хорошо, единственный потенциальный аргумент против этого - архитектурный - будет ли он масштабироваться?

...