Wenn eine Entität keinen expliziten 'Typ' hat (z. B. Player) und lediglich eine Sammlung von Komponenten ist, wie identifiziere ich die Entitäten, an denen meine Systeme arbeiten sollen und nicht? Zum Beispiel kollidieren bei einem Pong-Spiel sowohl das Paddel als auch der Ball mit den Fenstergrenzen. Die Kollisionsbehandlungssysteme sind jedoch für jedes System unterschiedlich, daher sollte ein System keine Entitäten des falschen Typs behandeln.
void PlayerCollisionSystem::update(std::vector<Entity *> entities) {
typedef std::vector<Entity *>::iterator EIter;
for (EIter i = entities.begin(); i != entities.end(); ++i) {
Entity *player = *i; // How do I verify that the entity is a player?
// Get relevant components.
PositionComponent *position = player->getComponent<PositionComponent>();
VelocityComponent *velocity = player->getComponent<VelocityComponent>();
SpriteComponent *sprite = player->getComponent<SpriteComponent>();
// Detect and handle player collisions using the components.
}
}
Sowohl der Spieler als auch der Ball haben dieselben relevanten Komponententypen für die Kollisionsbehandlung, ihre Systemimplementierungen sind jedoch unterschiedlich.
Wenn ich einen Container mit allen Spielentitäten habe, wie identifiziere ich bestimmte Entitätstypen, ohne Entity
eine Mitgliedsvariable zu erben oder einzuschließen, z. B. std::string type
in welchem Fall eine Entität nicht mehr nur eine Sammlung von Komponenten ist?
quelle
Ein System ist nur dann nützlich, wenn es nützlich ist. Wenn ein System, bei dem eine Entität "einfach eine Sammlung von Komponenten" ist, weniger nützlich ist als ein System, bei dem eine Entität hauptsächlich eine "Sammlung von Komponenten" ist, dann tun Sie dies .
Hören Sie auf, "reine" Systeme zu entwickeln, und konzentrieren Sie sich darauf, gute Systeme zu entwickeln, die das tun, was Sie brauchen. Verwenden Sie Komponenten, bis Komponenten für Sie nicht mehr nützlich sind. Dann benutze etwas anderes.
Sie haben bereits mehr Zeit damit verbracht, darüber nachzudenken, als es verdient.
quelle
Wenn Sie Entitäten einen expliziten Typ zuweisen möchten, können Sie am einfachsten eine Typvariable in der Entitätsklasse definieren. Halten Sie sich nur so lange an das EC-Muster, wie es nützlich ist.
Andernfalls wird der Typ durch die Komponentenattribute impliziert. Zum Beispiel hätte die Physikkomponente ein Attribut für mobil oder stationär. Das System weiß dann, wann zwei Handys kollidieren (Ball und Paddel). Ebenso können Sie Attribute festlegen, wie das Kollisionssystem reagieren soll. Stoppen Sie einfach das Objekt oder reflektieren Sie es? Wenn Sie sich die Attribute ansehen, erhalten Sie eine Vorstellung davon, was die Entität ist, aber sie sollte irrelevant sein. Die Systeme sollten nicht wissen müssen, mit welchem Entitätstyp sie arbeiten, sie sollten mithilfe der ihnen bereitgestellten Komponenten genügend Informationen erhalten.
Schließlich können Sie eine zusätzliche Komponente hinzufügen, die einen Typ enthält. Wie beim Hinzufügen eines Typs zur Entität werden Sie jedoch am Ende viel typspezifischen Code schreiben, wodurch der Zweck des EC-Systems zunichte gemacht wird.
quelle
Eine Entität ist eine Reihe von Komponenten. Sie können einem zufälligen Satz keine ordentlichen Beschriftungen zuweisen. Das Aufgeben von Typbeschränkungen ist der Preis für die große Flexibilität.
Natürlich können Sie spezielle (typisierte) Entitätsklassen haben, die den Komponenten Einschränkungen auferlegen.
Im Idealfall sind die Komponenten unabhängig. Die Lösung für Ihr Problem besteht also darin, die Kollisionsbehandlung für jede Unterkomponente der Reihe nach aufzurufen. In realen Anwendungen gibt es Abhängigkeiten und Ordnungsprobleme. In diesem Fall benötigen Sie in jeder Methode der Entity-Klasse eine Dispatcher-Logik.
quelle