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 Vector3ist zunächst etwas unintuitiv, weil dasWorldEventja in Zeile 13 mithilfe seiner Konstruktormethode bereits direkt einVector3-Objekt als letzten Parameter übergeben bekommen hat. - Wenn man sich die Konstruktormethode der Klasse
WorldEventeinmal anschaut, fällt auf, dass der letzte Parameter dieser Methode einen Wert des Typsobjecterwartet. - Der Typ
objectist die Oberklasse aller Datentypen in C#. Das bedeutet, dass einWorldEventbei seiner Erstellung quasi ein beliebiges Objekt eines beliebigen Typs überreicht bekommen darf. - Doch wenn das passiert, speichert das
WorldEventdieses Objekt auch alsobjectab – 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 FeldTagnur noch vom Typobjectist. - 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