Zaczynam od pierwszego „właściwego” projektu gry i nieuchronnie uderzyłem w blok, próbując zdecydować, w jaki sposób komponenty gry w XNA powinny się komunikować.
Od poprzednich zdarzeń programowania GUI (Java), procedury obsługi i nasłuchiwania wydawały się być rozwiązaniem. Więc miałbym jakąś magistralę zdarzeń, która akceptuje rejestracje zdarzeń i klasy subskrybowane do tych zdarzeń, z programami obsługi zajmującymi się nimi. Na przykład (pseudokod):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Jednak nie jestem pewien konfiguracji kodu (w języku C #), który byłby wymagany do pełnego osiągnięcia tego celu. Co śledzi wydarzenia (jakiś autobus?) I jak jest zorganizowane?
Wydaje się również, że wiele mówi się o usługach gier, w których można zarejestrować GameComponent w głównej klasie Game.cs, a następnie pobrać go z dowolnego miejsca w kodzie, który ma odniesienie do głównego obiektu „Game”. Próbowałem tego z moim obiektem SpriteBatch i wydaje się to bardzo łatwe .. nie widzę jednak, aby był on tak elastyczny jak model zdarzeń.
Weźmy na przykład śmierć wroga. Chcemy zaktualizować wynik gry. Korzystając z usług, mogę uzyskać odniesienie do mojego obiektu StateManager utworzonego w Game1 i dodanego jako usługa, a następnie ustawić „score” na nową wartość. Myślałem, że zdarzenie „onEnemyDeath”, które może być obsługiwane w różny sposób przez wiele klas, ale zainicjowane przez 1 linię kodu w odpowiedniej sekcji „wykrywanie śmierci wroga”, byłoby lepsze niż indywidualne rzucanie każdego wymaganego GameComponent, a następnie wywoływanie metody są wymagane.
A może są to gorsze strategie niż coś innego?
Zdaję sobie sprawę, że jest to częściowo moja słaba znajomość języka C #, podobnie jak paradygmaty komunikacji w grach, ale naprawdę chciałbym, aby ta podstawowa rzecz była właściwa.
Aktualizacja
Patrząc na Usługi, jestem bardziej szczegółowy, jestem mniej przekonany - w zasadzie przekazuje zmienną globalną (z tego, co rozumiem).
Aktualizacja 2
Po zapoznaniu się z tym podstawowym samouczkiem na temat obsługi zdarzeń i testowania przykładowego kodu wydaje się, że zdarzenia byłyby logicznym wyborem dla tego, co omawiam. Ale nie mogę tego wiele użyć w próbkach, które widziałem. Czy jest jakiś oczywisty powód, dla którego nie należy?