Skip to content

Game Processing

damios edited this page Aug 2, 2018 · 5 revisions

Die fixedUpdate()-Methode

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.


ProcessingSystem

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).


RoundEndSystem

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.


Wie geht's weiter

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?