Я только начинаю работать с Monogame, потратив немало времени на работу с LibGDX, и решил, что взгляну на NEZ, чтобы быстрее начать работу.
Играя с NEZ Я впервые познакомился с системами компонентов сущностей, и после большого количества чтения я чувствую, что у меня достаточно приличного гр asp того, как они должны работать, однако просмотр образцов, поставляемых с NEZ, дает мне немного запутан.
В примере приключения Ниндзя Ниндзя (доступно здесь: https://github.com/prime31/Nez-Samples/tree/master/Nez.Samples/Scenes/Ninja%20Adventure) есть довольно базовая c настройка:
- ниндзя - Компонент (выглядит как архетип)
- Mover - Компонент (обрабатывает движение и содержит компонент обнаружения столкновений)
- SpriteAnimator - Компонент
Вся обработка ввода (т. Е. Клавиатура и c) обрабатывается в рамках метода обновления компонента Ninja.
Аналогично, снаряд, который ниндзя может выстрелить, имеет прикрепленный FireballProjectileController
и в своем методе on update он вычисляет движение, выполняет обнаружение столкновений и уничтожает объект, если он что-то касается.
В приведенных выше двух примерах все, что происходит в методах обновления, похоже на то, что вы делаете. Я бы добавил в систему не обновление отдельного компонента. Например,
- Создание системы ввода, которая проходит через все объекты с компонентом ввода и обновляет их положение на основе нажатых клавиш и значения в компоненте скорости
- Создание обнаружения столкновения система, которая проходит через все сущности с физическим компонентом и выполняет обнаружение столкновений
Итак, мои вопросы:
- Это всего лишь личное предпочтение разработчика NEZ?
- Должны ли компоненты иметь какой-либо код, кроме некоторых базовых c сеттеров / геттеров / вспомогательных функций для расчета изменений их внутренних значений?
- Есть ли преимущество для выполнения всей этой логики c внутри компонентов, а не вытащить их в систему?
Спасибо