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 Motion
System aller Dinge , da sie nicht bewegen oder notwendigerweise in Kollisionserkennung teilnehmen animiert - Kameras, Nebel, etc. - aber es scheint , dass Collision
und Motion
voneinander abhängig sind.
Wenn Motion
ein Objekt bewegt wird, muss die Transformation mit validiert Collision
und 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 Motion
System 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 Motion
System hineingeschoben wird, die nicht für alle Entitäten gilt, die ein Movable
Attribut haben.
Ich könnte auch einen Bewegungsvektor in dem Movable
Attribut speichern und das Collider
System Transform
nach Bedarf anpassen lassen , aber dazu gehört das Duplizieren von Funktionen zwischen Motion
und Collider
oder ein Rückruf von Collider
bis Motion
mit 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?