Wenn Sie z.B. eine gegnerische Instanz zeitversetzt entstehen lassen möchten, können Sie solche Events planen:
public class GameWorld : World { public override void Act() { } public override void Prepare() { WorldEvent myEvent = new WorldEvent( 3.0f, // Ereignis tritt 3 Sekunden nach Weltstart auf "EnemySpawn", // Beschreibung des Ereignisses (frei wählbar) new Vector3(5, 2, -3) // Platz für ein beliebiges Infoobjekt (z.B. hier: Ort des Events) ); AddWorldEvent(myEvent); } // Um Events lesen zu können, muss in der Welt-Klasse folgende // Methode hinzugefügt werden. // Sollte ein Event auftreten, wird diese Methode automatisch // von der Engine aufgerufen und das aktuell zu verarbeitende // Event wird als Parameter e übergeben, damit man sich selbst // um dessen Verarbeitung kümmern kann: protected override void OnWorldEvent(WorldEvent e) { // Reagiere auf jede Event-Beschreibung unterschiedlich: if(e.Description == "EnemySpawn") { // Weil dem Event als dritter Parameter ein Vector3 // hinzugefügt wurde, können wir dieses Objekt // hier wieder in diesen Datentyp 'casten': Vector3 pos = e.Tag as Vector3; // Erstelle das gewünschte Objekt mithilfe der // gesammelten Informationen: Enemy e = new Enemy(); e.SetPosition(pos); AddGameObject(e); } else if(e.Description == "RemoveAllEnemies") { // ... } } }
Hinweis zu Zeile 33:
- Der Befehl
e.Tag as Vector3
ist zunächst etwas unintuitiv, weil dasWorldEvent
ja in Zeile 13 mithilfe seiner Konstruktormethode bereits direkt einVector3
-Objekt als letzten Parameter übergeben bekommen hat. - Wenn man sich die Konstruktormethode der Klasse
WorldEvent
einmal anschaut, fällt auf, dass der letzte Parameter dieser Methode einen Wert des Typsobject
erwartet. - Der Typ
object
ist die Oberklasse aller Datentypen in C#. Das bedeutet, dass einWorldEvent
bei seiner Erstellung quasi ein beliebiges Objekt eines beliebigen Typs überreicht bekommen darf. - Doch wenn das passiert, speichert das
WorldEvent
dieses Objekt auch alsobject
ab – nicht z.B. alsVector3
. Zunächst ist das kein Problem, aber wenn das Event später in derOnWorldEvent()
-Methode verarbeitet wird, kann man dem Event-Objekt nicht mehr ansehen, von welchem Typ (Feldname:Tag
) es ursprünglich mal war, weil das FeldTag
nur noch vom Typobject
ist. - Deshalb muss das jeweilige Objekt mit dem Schlüsselwort „
as
“ wieder in den Typ umgewandelt (englisch/deutsch: „gecastet“) werden. Das funktioniert aber nur, wenn das Objekt tatsächlich von dem angegebenen Zieltyp ist.
Schreibe einen Kommentar