Ich weiß, dass diese Frage mehrmals gestellt wurde, bin mir aber immer noch nicht sicher, wie die Eingabebehandlung in einer komponentenbasierten Engine implementiert werden soll.
Das komponentenbasierte Design, das ich verwendet habe, basierte auf der Blogserie von T = Machine und auf Artemis, in denen Entities nur IDs sind.
Bei der Implementierung der Eingabehandhabung habe ich drei Hauptideen:
- Die Eingabekomponente enthält Ereignisse, an denen sie interessiert ist. Das Eingabesystem übersetzt Schlüssel- und Mausereignisse in Spielereignisse und durchläuft die Entitäten mit der Eingabekomponente. Wenn sie an dem Ereignis interessiert sind, ergreift das Eingabesystem eine geeignete Aktion. Diese Aktion wäre für das Eingabesystem fest codiert.
- Keine Eingabekomponente. Sie würden Entitäten mit bestimmten Ereignissen im Eingabesystem registrieren. Das Eingabesystem sendet dann Nachrichten (mit der Entitäts-ID und dem Ereignistyp) an andere Systeme, damit diese die entsprechenden Maßnahmen ergreifen können. Oder wie im ersten Fall würden die Aktionen für das Eingabesystem fest codiert.
- Ähnlich wie bei der ersten Methode, aber anstatt die Aktion fest in das Eingabesystem zu codieren, würde die Komponente eine Zuordnung von Ereignissen zu Funktionen (dh
std::map<std::function>
) enthalten, die vom Eingabesystem aufgerufen würden. Dies hat den zusätzlichen Effekt, dass dasselbe Ereignis mit verschiedenen Aktionen gekoppelt werden kann.
Würden Sie eine der oben genannten Methoden empfehlen oder haben Sie Vorschläge, die mir bei der Implementierung eines flexiblen Eingabeverarbeitungssystems helfen könnten? Außerdem bin ich noch nicht mit Multithreading vertraut, aber auch Vorschläge, die die Implementierung threadfreundlich machen würden, sind willkommen.
Hinweis: Eine zusätzliche Anforderung, die die Implementierung erfüllen soll, besteht darin, dass ich die gleiche Eingabe an viele Entitäten übergeben kann, z. B. das gleichzeitige Verschieben einer Kameraentität und des Players.