HARALD MELCHER

Flattiverse - Raumschiffe Programmieren in C#

Umschauen

Body.cs

Scannen erfolgt von einem Schiff aus. Der Aufruf von NewShip erzeugt ein Schiff im angegebenen Universum.

await server.Player.Universe.NewShip("SuperShip")

Wenn das Schiff im Universum ist, kann es vom Schiff aus sichtbare Körper im Weltall sehen. Dazu hängt man einen Handler an server.ScanEvent, den der Connector immer aufruft, wenn neue Körper sichtbar sind.

Ab jetzt erfolgen immer dann Aufrufe des Handlers (s.o.), wenn das Schiff neue Körper sieht.

Die Handler-Methode erhält einen Flattiverse-ScanEvent, der über gescannte Körper informiert:

private void scanEvent(FlattiverseEvent @event) { ... }

Zur Anzeige neu gescannter Köper dient die von FlattiverseEvent abgeleitete Klasse NewUnitEvent. Eine einfache if-Anweisung filtert (zunächst) nur diese aus und ein Cast auf NewUnitEvent stellt sicher, dass wir auf dessen Eigenschaft Unit zugreifen können. Das ist dann ein Körper, der in der Nähe des Schiffes fliegt. Unit hat dabei z.B. den Typ Sun, Planet oder Target.

Die Body-Klasse kann diese Körper in einer Liste units sammeln und, wenn sie sich geändert hat, der Gui-Klasse (deren Referenz sie durch ConnectGui hat) durch Aufruf der Methode gui.DisplayUnits(units) zum Anzeigen geben.

Eine Herausforderung ist, dass die Körper direkt um’s Schiff herum schon NewUnitEvents triggern, während body.Start() noch läuft und das Gui möglicherweise noch nicht existiert. Das heißt, bei der Zuweisung des Gui zum Body ist die Liste schon gefüllt und es gibt momentan keine neuen Körper, die Events triggern.

Deshalb ruft ConnectGui die Methode gui.DisplayUnits(units) auf, damit die Anzeige auch die vor Erstellen des Guis bereits bekannten Körper kennt.