Я начинаю свой первый «правильный» игровой проект, и я неизбежно попадаю в блок, пытаясь решить, как должны взаимодействовать игровые компоненты в XNA.
Из предыдущих (Java) событий программирования GUI, обработчики и слушатели выглядели как путь вперед. Таким образом, у меня была бы какая-то шина событий, которая принимает регистрации событий и классы, подписанные на эти события, с обработчиками для их обработки. Например (псевдокод):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Однако я не уверен в настройке кода (в C #), которая потребовалась бы для полного выполнения этого. Что отслеживает события (какой-то автобус?) И как оно структурировано?
Похоже, что в Game Services также много говорится о том, что вы можете зарегистрировать GameComponent в своем основном классе Game.cs, а затем извлечь его из любого места в вашем коде, который имеет ссылку на основной объект «Game». Я пробовал это с моим объектом SpriteBatch, и это кажется очень легким ... однако я не вижу такой гибкости, как у модели событий.
Взять, к примеру, когда враг умирает. Мы хотим обновить счет игры. Используя службы, я могу получить ссылку на мой объект StateManager, созданный в Game1 и добавленный в качестве службы, а затем установить для «показателя» новое значение. Я бы подумал, что событие «onEnemyDeath», которое может обрабатываться множеством классов по-разному, но инициируется 1 строкой кода в соответствующем разделе «Обнаружение смерти противника», было бы лучше, чем индивидуальное приведение каждого требуемого GameComponent, а затем вызов любого методы требуются.
Или эти стратегии уступают чему-то другому?
Я понимаю, что это отчасти мое плохое знание C # и парадигм игрового общения, но я бы очень хотел понять эту фундаментальную вещь правильно.
Обновить
Посмотрев на сервисы более подробно, я менее убежден - это, в основном, передача глобальной переменной (насколько я понимаю).
Обновление 2
Изучив этот базовый учебник по обработке событий и тестированию примера кода, кажется, что события будут логичным выбором для того, что я обсуждаю. Но я не могу использовать его в примерах, которые я видел. Есть ли какая-то очевидная причина, почему нельзя?