2017-01-23 2 views
0

Ich baue gerade mein LibGDX-Projekt um, um eine ECS-Struktur unter Verwendung von Ashley zu passen. Im Moment habe ich das folgende System-Struktur haben:Daten zwischen Systemen in ECS teilen (Ashley)

  • InputSystem (Griffe Spieler-Input)
  • PhysicSystem (Geschwindigkeit Einheiten gilt, tut Kollisionserkennung und verschiebt sie)
  • Kamerasystem (passt die Kamera die Kamera-Fokus)
  • RenderingSystem (transformiert die Spritebatch mit der Kamera-Informationen und zieht alle Einheiten)

Jetzt weiß ich, dass jedes System ist su psposed enthält die gesamte Logik, die es benötigt, und ist eingekapselt, um die Kompliziertheit zu reduzieren. Aber ich brauche die Kamera im CameraSystem, um es anzupassen, ich brauche es im RenderSystem, um die Kamera-Transformation anzuwenden, und ich brauche es im InputSystem, um zu sehen, wohin die Maus zeigt. Wie lösen Sie das mit dem ECS-Ansatz? Können Systeme miteinander kommunizieren? Sollte ich nur ein Singleton namens "SharedData" verwenden, wo ich all die Dinge, die mehrere Systeme benötigen, ablegen? Scheint ein bisschen hässlich für mich.

Vielen Dank im Voraus :)

+0

Ich verwende normalerweise Vis-Runtime für ECS in meinem Spiel. In vis-Laufzeit wird ein System in ein anderes System injiziert, so dass man leicht auf ein anderes System zugreifen kann. Gemäß mir können Sie CameraSystem mit anderem System teilen. – Aryan

Antwort

1

Ja, einen Singleton mit dem Zweck der Verwendung eines ECS in erster Linie besiegen würde. In einem ECS wird der Ansatz verwendet, dass alle gemeinsam genutzten Daten mit Entitäten ausgedrückt werden. Es ist völlig in Ordnung, einen Typ Entity zu haben, für den es während der Spieldauer nur einmal eine Instanz geben wird.

Diese können dann direkt von der Engine zugegriffen werden, wenn die EntiySystem hinzugefügt wird. Ein alternativer Ansatz könnte darin bestehen, gemeinsam genutzte Entitäten an den Konstruktor der Systeme zu übergeben, wenn häufig darauf zugegriffen wird. In der Vergangenheit habe ich dies zum Übergeben einer Box2D World Entität verwendet.

Ich glaube, dass mein Code meine Argumentation besser erklärt, so dass Sie sich eines meiner vorherigen Spiele mit Ashley ansehen können. https://github.com/basimkhajwal/LSD

P. S - Mein Projekt umfasst auch eine Ereigniswarteschlange für die Nachrichtenübermittlung zwischen den verschiedenen Unternehmen Systeme (ohne Weitergabe von Daten, werden alle Daten noch in Entity Klassen eingekapselt ist), die ich gefunden extrem nützlich zu sein.

+0

Super, ich werde in deinen Code eintauchen und sehen, wie du das alles geschafft hast. Ein Eventing-System klingt auch nach einer guten Idee –

Verwandte Themen