-
Notifications
You must be signed in to change notification settings - Fork 0
Game Processing
Die fixedUpdate()
-Methode der GameSession
-Klasse ist der Ort, an dem die Verarbeitung des Spiels stattfindet. Aufgerufen wird die Methode jeden Tick (= ein Verarbeitungsschritt), der bei normaler Spielgeschwindigkeit 1/10 Sekunden dauert. Über die fixedUpdate()
-Methode werden dann einzelne ProcessingSystems
aufgerufen, in denen die tatsächliche Arbeit stattfindet.
In der setupGame()
-Methode der GameSession
-Klasse werden die einzelnen ProcessingSystems
wie folgt registriert:
ProcessingSystem<Player> s = new FirstEventWaveClientSystem(eventBus, localNetworkId);
s.init(city, getGameSeed());
this.playerSystems.add(s);
Ein System wird zunächst instanziiert, um anschließend mit der City und dem Random-Seed des Spiels intialisiert zu werden. Anschließend wird das System der Liste der Systeme hinzugefügt. Hier ist zwischen Player-Systemen, die Spieler verarbeiten, und Charakter-Systemen, die eben solche verarbeiten, zu unterscheiden.
Jedes ProcessingSystem
muss über die isProcessedContinuously()
-Methode entscheiden, ob es pro Spielrunde nur einmal oder mehrmals in einem festen Intervall aufgerufen werden will. Über getTickRate()
wird demnach entweder das Intervall zurückgeliefert oder aber der Zeitpunkt, zu dem das System einmalig ausgeführt wird.
Die richtige Arbeit findet in der process(short, Player)
-Method statt: Hier wird jeweils ein Player
/Character
sowie dessen ID übergeben, damit das Entity auch in der City aufgefunden werden kann.
Auch für die ProcessingSystems gilt: Veränderungen von Entity-Werten werden nur auf Server-Seite vorgenommen! Anschließend müssen diese Änderungen dann über RMI synchronisiert werden. Ausnahme ist nur das RoundEndSystem (s.u.). Damit bleibt für die Client-Systeme letztlich nur wenig Raum: Im Wesentlichen weisen diese nur auf Ereignisse oder Interaktionsmöglichkeiten hin, ohne direkte Auswirkungen zu haben (bspw. eine Notification, wenn ein neues Amt frei ist).
Am Ende einer jeden Runde wird sowohl auf dem Server als auch auf dem Clienten das RoundEndSystem
ausgeführt. Daher ist es das einzige auf dem Clienten laufende System, das auch direkt Änderungen an den Entities vornehmen darf. Das sowie die Tatsache, dass das System am Ende der Runde läuft und somit keine tiefgreifenden Performance-Bedenken bestehen, sollte ausgenutzt werden: Rechenintensive sowie umfangreiche (d.h. viele Entities betreffende) Aktionen sollten im RoundEndSystem
durchgeführt werden.
Weitere Informationen zur Umsetzung des Spiels sind u.a. hier zu finden:
- Entity Handling: Wie werden Entities im Spiel gehandhabt?
- EventBus: Wie wird mit Callbacks umgegangen, v.a. wenn diese auf den Render-Thread zugreifen müssen?
- Input-Events: Wie können Input-Events abgefangen und verarbeitet werden?