Derzeit stehe ich vor folgendem Problem:
Ich versuche, einen Pong-Klon mithilfe eines Entity-Component-Systems (ECS) zu schreiben . Ich habe das "Framework" ganz alleine geschrieben. Es gibt also eine Klasse, die die Entitäten mit allen Komponenten verwaltet. Dann gibt es die Komponentenklassen selbst. Und zuletzt gibt es meine Systeme, die nur alle Entitäten erhalten, die Komponenten haben, die das System benötigt.
So sucht mein Bewegungssystem beispielsweise nach allen Objekten, die eine Positionskomponente und eine Bewegungskomponente haben. Die Positionskomponente hält nur die Position und die Bewegungskomponente hält die Geschwindigkeit.
Das eigentliche Problem ist jedoch mein Kollisionssystem. Diese Klasse ist wie ein logischer Blob. Ich habe so viele Sonderfälle in dieser Klasse.
Zum Beispiel: Meine Paddel können mit den Rändern kollidieren. In diesem Fall wird ihre Geschwindigkeit auf Null gesetzt. Mein Ball kann auch mit den Rändern kollidieren. In diesem Fall wird die Geschwindigkeit jedoch nur auf der Normalen der Grenze gespiegelt, sodass sie reflektiert wird. Dazu habe ich dem Ball eine zusätzliche Physikkomponente gegeben, die nur sagt: "Hey, dieses Ding hört nicht auf, es reflektiert." Tatsächlich hat die Physikkomponente also keine realen Daten. Es ist eine leere Klasse, die nur dazu dient, dem System mitzuteilen, ob ein Objekt reflektiert oder stoppt.
Dann kommt Folgendes: Ich möchte einige Partikel rendern, wenn der Ball mit den Paddeln oder den Rändern kollidiert. Ich denke, der Ball muss eine weitere Komponente erhalten, die das Kollisionssystem anweist, bei einer Kollision Partikel zu erzeugen.
Dann möchte ich Power-Ups haben, die mit den Paddeln kollidieren können, aber nicht mit den Rändern. In diesem Fall müssen die Power-Ups verschwinden. Ich würde also viel mehr Fälle und Komponenten benötigen (um dem System mitzuteilen, dass einige Entitäten nur mit bestimmten anderen kollidieren können, aber nicht mit allen, selbst wenn andere tatsächlich kollidieren können, musste das Kollisionssystem außerdem die Power-Ups anwenden die Paddel usw. usw. usw. usw.).
Ich sehe, dass das Entitätskomponentensystem eine gute Sache ist, weil es flexibel ist und Sie keine Probleme mit der Vererbung haben. Aber ich stecke momentan total fest.
Denke ich zu kompliziert Wie soll ich mit diesem Problem umgehen?
Klar, ich muss Systeme erstellen, die tatsächlich für "Nachkollision" verantwortlich sind, also sagt das Kollisionssystem nur "Ja, wir haben eine Kollision im letzten Frame" und dann gibt es eine Reihe von "Nachkollisions" -Systemen, die Alle erfordern unterschiedliche (Kombinationen von) Komponenten und ändern dann die Komponenten. Zum Beispiel würde es ein Bewegungs-Nachkollisionssystem geben, das Dinge stoppt, die anhalten müssen, wenn eine Kollision auftritt. Dann ein Physik-Nachkollisionssystem, das Dinge usw. widerspiegelt.
Aber dies scheint mir auch keine richtige Lösung zu sein, weil zum Beispiel:
- Mein Bewegungsnachkollisionssystem würde Entitäten benötigen, die eine Positionskomponente, eine Bewegungskomponente und eine Kollisionskomponente haben. Dann würde es die Geschwindigkeit der Entität auf Null setzen.
- Das Physik-Nachkollisionssystem würde Entitäten benötigen, die eine Positionskomponente, eine Bewegungskomponente, eine Kollisionskomponente und eine Physikkomponente aufweisen. Dann würde es den Geschwindigkeitsvektor widerspiegeln.
Das Problem liegt auf der Hand: Die Bewegung nach der Kollision benötigt Entitäten, die eine Teilmenge der Entitäten im Physik-Nachkollisionssystem sind. Zwei Nachkollisionssysteme würden also mit denselben Daten arbeiten, was zur Folge hätte: Obwohl eine Entität eine physikalische Komponente hat, wäre ihre Geschwindigkeit nach einer Kollision Null.
Wie werden diese Probleme im Allgemeinen in einem Entitätskomponentensystem gelöst? Sind diese Probleme überhaupt üblich oder mache ich etwas falsch? Wenn ja, was und wie soll es stattdessen gemacht werden?