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 NewUnitEvent
s 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.