Game Engine Math

KWEngine, Teil 23: Events zeitlich planen

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 das WorldEvent ja in Zeile 13 mithilfe seiner Konstruktormethode bereits direkt ein Vector3-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 Typs object erwartet.
  • Der Typ object ist die Oberklasse aller Datentypen in C#. Das bedeutet, dass ein WorldEvent bei seiner Erstellung quasi ein beliebiges Objekt eines beliebigen Typs überreicht bekommen darf.
  • Doch wenn das passiert, speichert das WorldEvent dieses Objekt auch als object ab – nicht z.B. als Vector3. Zunächst ist das kein Problem, aber wenn das Event später in der OnWorldEvent()-Methode verarbeitet wird, kann man dem Event-Objekt nicht mehr ansehen, von welchem Typ (Feldname: Tag) es ursprünglich mal war, weil das Feld Tag nur noch vom Typ object 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.

Beitrag veröffentlicht

in

von

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.