Wichtig ist, dass Du "SoA" verwendest, damit es "data oriented" ist. Dann kann ein Movesystem so aussehen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class MoveSystem {
void update(ComponentData& data,float dt) {
Vector2f* position = data.positions;
Vector2f* velocity = data.velocities;
for ( int i = 0; i < data.num; ++i ) {
*position += *velocity * dt;
++position;
++velocity;
}
}
}
|
Von der Idee her schonmal das was ich mir vorstelle
Nur das FatArray stört mich bisschen
Was mir lustigerweise gerade klar wird: Ich habe heute die Aufteilung der Subsysteme etwas geändert und de facto einen Zwischenschritt zwischen strikter Komponententrennung von FatArray gemacht xD Beispielsweise habe ich das Objekt-Behavior der Physik zugeordnet, d.h. Physik macht nun Bewegung, Kollision und die Verwaltung der Verhalten-Flags (Idle, Move, Attack etc.). Das Rendering- und Animationssystem habe ich zum Graphics-System zusammengelegt, d.h. Animieren und Zeichnen in einem System. Dadurch muss die Physik nicht mehr das aktuelle Bewegungsflag erfragen (um festzustellen, ob eine Bewegung ausgeführt werden muss). Und das Animations- und Rendersystem arbeiten quasi verzahnt. Trotzdem muss das neue Grafik-System noch Position und Blickrichtung erfragen (in dem es sich quasi
PhysicsData const & pro Objekt holt. Das Input- und das KI-System arbeiten beide ohne weitere Daten (lediglich das Inputsystem braucht weitergeleitete Eingabeevents). Beide propagieren an das Physik-System die beabsichtigten Bewegungen bzw. an das Avatar-System die beabsichtigten Aktionen (Angreifern, Zaubern etc.), so dass die Zielsysteme dann für sich entscheiden können, ob die Bewegung/Aktion im Moment erlaubt ist. Alternativ könnte man auch die Bewegungen zum AvatarSys propagieren, damit das z.B. Stun berücksichtigen kann - und dann schließlich zur Physik weiterleiten.
Mit dem anderen Auge überlege ich gerade wie ich die Daten innerhalb der Systeme organiseren... manche iterieren nur über die Objekte (Input, KI, Avatar), andere iterieren (Bewegung @ Physik, Animation @ Graphics) über die Objekte und wollen einzelne Objekte über ihre Position (Kollision @ Physik, Rendering @ Graphics) erfragen. Für das reine iterieren habe ich im Moment den "contigeous array of data"-Ansatz im Auge, für die Physik eine Mischung mit Quadtree sowie für die Grafik ein diskretes Grid (da 2D Spiel) und eine Lookup-Tabel (um von der ObjektID auf die Position im Grid und dadurch an die Komponente zu kommen - bisschen umständlich aber es sind ja noch nicht alle Messen gelesen
).
LG