Ich beginne mit meinem ersten "richtigen" Spielprojekt und bin unweigerlich auf einen Block gestoßen, um zu entscheiden, wie Spielkomponenten in XNA kommunizieren sollen.
Von früheren (Java) GUI-Programmierereignissen schienen Handler und Listener der richtige Weg zu sein. Ich hätte also eine Art Ereignisbus, der Ereignisregistrierungen und Klassen akzeptiert, die diese Ereignisse abonniert haben, mit Handlern, die sich darum kümmern. Zum Beispiel (Pseudocode):
class SpriteManager
Update(){
if(player.collidesWith(enemy)
// create new 'PlayerCollisionEvent'
}
class HUDManager
onPlayerCollisionEvent(){
// Update the HUD (reduce lives etc)
}
Ich bin mir jedoch nicht sicher, welches Code-Setup (in C #) erforderlich ist, um dies vollständig zu erreichen. Was verfolgt Ereignisse (eine Art Bus?) Und wie ist sie aufgebaut?
Es scheint auch viel über Game Services erwähnt zu werden, wobei Sie eine GameComponent in Ihrer Hauptklasse Game.cs registrieren und sie dann von einer beliebigen Stelle in Ihrem Code abrufen können, die einen Verweis auf das Hauptobjekt 'Game' enthält. Ich habe dies mit meinem SpriteBatch-Objekt versucht und es scheint sehr einfach zu sein. Ich kann jedoch nicht sehen, dass dies so flexibel ist wie ein Ereignismodell.
Nehmen wir zum Beispiel, wenn ein Feind stirbt. Wir möchten die Spielergebnisse aktualisieren. Mithilfe von Diensten kann ich einen Verweis auf mein in Game1 erstelltes und als Dienst hinzugefügtes StateManager-Objekt abrufen und dann "Punktzahl" auf den neuen Wert setzen. Ich hätte gedacht, dass ein "onEnemyDeath" -Ereignis, das von einer Vielzahl von Klassen unterschiedlich behandelt werden kann, aber durch eine Codezeile im entsprechenden Abschnitt "Erkennung feindlicher Todesfälle" ausgelöst wird, besser wäre, als jede erforderliche GameComponent einzeln zu wirken und dann irgendetwas aufzurufen Methoden sind erforderlich.
Oder sind diese Strategien etwas anderem unterlegen?
Mir ist klar, dass dies teilweise mein schlechtes C # -Wissen ist, ebenso wie Spielkommunikationsparadigmen, aber ich würde wirklich gerne diese grundlegende Sache richtig machen.
Aktualisieren
Nachdem ich mir Services angesehen habe, bin ich weniger überzeugt - es wird im Grunde genommen eine globale Variable weitergegeben (soweit ich weiß).
Update 2
Nachdem Sie sich dieses grundlegende Tutorial zur Ereignisbehandlung und zum Testen des Beispielcodes angesehen haben, scheint es, dass Ereignisse eine logische Wahl für das sind, was ich diskutiere. Aber ich kann nicht viel davon in den Beispielen verwenden, die ich gesehen habe. Gibt es einen offensichtlichen Grund, warum man nicht sollte?