Mehr Spaß mit einem ES ...
Derzeit habe ich ein paar Systeme:
- Renderer (Attribut "Renderbar", Attribut "Transformieren")
- Bewegung (Attribut "Verschiebbar", Attribut "Transformieren", Attribut "Renderbar" [für Begrenzungsrahmen usw.])
- Eingabe (InputReceiver-Attribut)
- etc.
Ich füge die Kollisionserkennung hinzu. Mein erster Gedanke war, ein neues System hinzuzufügen, das Kollisionen ausführt. Es macht Sinn für mich diese aus dem isoliert zu halten MotionSystem aller Dinge , da sie nicht bewegen oder notwendigerweise in Kollisionserkennung teilnehmen animiert - Kameras, Nebel, etc. - aber es scheint , dass Collisionund Motionvoneinander abhängig sind.
Wenn Motionein Objekt bewegt wird, muss die Transformation mit validiert Collisionund die Bewegung entweder abgebrochen oder angepasst werden (Prellen, Anhalten an einer Wand usw.).
Eine Alternative wäre, ein Collidable-Attribut zu erstellen, das einen Verweis auf ein Kollisionsobjekt - kd-tree, octree usw. - verwaltet, das von Entitäten gemeinsam genutzt wird, die miteinander kollidieren können. Das MotionSystem würde dann nach diesem Attribut suchen und es verwenden, um die Bewegung zu überprüfen oder anzupassen.
Aus Code-Sicht ist das eine akzeptable Lösung. Aus Sicht der ECS-Architektur scheint es jedoch so zu sein, dass Logik in das MotionSystem hineingeschoben wird, die nicht für alle Entitäten gilt, die ein MovableAttribut haben.
Ich könnte auch einen Bewegungsvektor in dem MovableAttribut speichern und das ColliderSystem Transformnach Bedarf anpassen lassen , aber dazu gehört das Duplizieren von Funktionen zwischen Motionund Collideroder ein Rückruf von Colliderbis Motionmit einigen Daten über den Kollisionsort und Oberflächendaten für Abprall / Reflexion usw .
Dies mag unter die Überschrift "Special Case Hack" fallen, aber ich möchte einige Eingaben von denen erhalten, die dies zuvor behandelt haben, ohne eine Tonne Edge-Case-Code zu erstellen.
Die Frage Was ist ein guter Weg, um eine enge Kopplung zwischen Bewegungs- und Kollisionssystemen zu vermeiden, wenn sie scheinbar voneinander Kenntnis benötigen?