Entschuldigung, wenn diese Frage schon einmal beantwortet wurde, aber nach unermüdlicher Suche konnte ich nichts finden.
Wie viele habe ich kürzlich auf den ECS-Zug gesprungen, und ich töte derzeit einige Zeit, indem ich ein bescheidenes ECS-Spiel mache. Das Spiel ist ein etwas einfaches 2D-Plattformspiel. Es ist in einfachem JS programmiert.
Das Layout des Spiels ist im Wesentlichen wie folgt:
Der Kern des Spiels ist die Engine. Die Engine führt die Spielschleife aus und enthält einen EventManager, der für das Auslösen von Ereignissen verantwortlich ist, und einen EntityManager, der für die Aufnahme aller Komponenten aller Entitäten verantwortlich ist.
Die gesamte Logik wird von Systemen ausgeführt. Das System registriert Event-Handler (dh Member-Funktionen) beim EventHandler für bestimmte EventTypes, die aufgerufen werden, wenn ein Ereignis dieses Typs ausgelöst wird.
Zum Beispiel:
this.eventManager.registerHandler(EventType.EVENT_RENDER, this.render, null, this);
Ich habe kürzlich vom expliziten Aufrufen aller systemrelevanten Funktionen in der Engine zu diesem Muster gewechselt.
Aber rüber zu meinem Problem und meiner Frage.
Zum Rendern habe ich ein RenderSystem. Dieses System enthält Verweise auf verschiedene Arten von zeichnbaren / animierbaren Komponenten, die es, wie Sie vermutet haben, rendert.
Bis vor kurzem enthielt dieses System auch einen Verweis auf ein anderes System , MapSystem, das alle Entitäten räumlich indiziert. Der Grund für diese Referenz war, eine Funktion nach dem Vorbild von aufrufen zu können
mapSystem.search(frame_bound);
Alle Entitäten, die nicht gerendert werden müssen, werden effektiv entfernt.
Ich habe also ein paar Fragen dazu:
Ist es eine sehr schlechte Praxis für Systeme, direkt zu kommunizieren? Etwas daran riecht für mich einfach nicht richtig.
Ich sehe, wie es Ihren Code ernsthaft komplizieren kann, wenn Sie sagen, 100 Systeme, und jedes System enthält Verweise auf viele der anderen Systeme. Hallo O (n ^ 2).
Wie führe ich eine Kommunikation wie oben beschrieben durch, wenn ich keine systemübergreifenden Referenzen haben soll?
Meine ersten Gedanken waren, eine Entität zu erstellen, deren Hauptzweck darin bestand, die erforderlichen Informationen zu speichern (dh alle Entitäten, die sich derzeit im Rahmen befinden). Lassen Sie dann MapSystem in diese Entität schreiben und RenderSystem daraus lesen.
Das scheint mir aber auch ziemlich unrein zu sein. Insbesondere, da die MapSystems-Suchfunktion nützlich sein kann, um in vielen verschiedenen Kontexten aufzurufen. Das Erstellen einer Entität pro aufrufendem Kontext scheint auch kein guter Weg zu sein.
TL; DR: Ist es schlecht für Systeme in einem ECS-Spiel, direkt zu kommunizieren und Verweise aufeinander zu halten?