2017-05-28 1 views
0

ich wan't zu wissen, wie könnte ich die Art, wie ich die Ereignisse in SFML Griff zu verbessern:SFML Parsing Ereigniscode

So habe ich eine Funktion namens process(), die einen Schalter für die Ereignisse Art hat, wie ich auch habe eine Funktion für jeden Typ (wie mousePressed, mouseReleased, keyPressed ...). Und mein Problem ist die Größe dieser Funktionen, da ich auch eine Enum-Klasse für die Zustände des Spiels habe, also in jeder Funktion gibt es einen Schalter für sie und in jedem Fall mache ich verschiedene Dinge, das Ergebnis ist, dass mouseReleased zum Beispiel ist 341 Zeilen lang.

Ich möchte wissen, wie ich die Ereignisse besser analysieren könnte, um die Größe der Funktionen zu reduzieren.

+0

In mehrere kleinere Funktionen aufgeteilt? –

+0

Schau mal in [Thor actions] (http://www.bromeon.ch/libraries/thor/tutorials/v2.0/actions.html) –

+0

Danke, das sieht interessant aus – sleiphir

Antwort

0

Sie könnten eine std::vector<bool> down haben und zum Index den Schlüsselcode oder die Maustaste verwenden (also einen Vektor für die Tastatur und einen anderen für die Maus). Dann, wenn Ereignis gedrückt wird, erhalten Sie nur down[event.key.code] = true und wenn das freigegebene Ereignis empfangen wird, stellen Sie es auf false ein.

+0

Benutze 'std :: map' dann besser, Sie müssen also nicht alle möglichen Werte abbilden, auch wenn sie nicht verwendet werden. – Mario

+0

@Mario 'std :: unordered_map' wäre dafür besser, aber noch besser, wenn man bedenkt, dass die Anzahl der gleichzeitig gedrückten Tasten immer niedrig ist (selbst wenn jemand die Tastatur schlägt, ist es wahrscheinlich <30), ein einfacher' std :: vector 'mit einem linearen Lookup ist besser. – Aidiakapi

+0

Nein, auf eine std :: map kann nur langsam zugegriffen werden. Und std :: vector ist eine Template-Spezialisierung, jeder boolesche Wert nimmt nur ein bisschen im Speicher, also ist das okay :) –

0

Sie möchten den Verarbeitungscode effektiv dezentralisieren. Aktivieren Sie verschiedene Komponenten, um einen Handler für ein Ereignis bei einem 'sfml event-dispatcher'-Objekt zu registrieren. Die einzige Aufgabe dieses Objekts besteht darin, die entsprechenden Handler aufzurufen (könnte mit einer std :: -Funktion dargestellt werden), wenn ein Ereignis eintrifft, ohne zu wissen, was genau dieser Handler tut.

+0

Danke, ich weiß nicht, wie std :: function funktioniert, aber ich kann lernen :) – sleiphir