Frage

Ich versuche, für mein kleines RPG-Projekt ein zentrales Ereignisverteilungssystem zu erstellen, das eine Art Observer-Muster verwendet, und benötige Ratschläge, wie Ereignisdaten am besten dargestellt werden können.

Ich werde einen EventManager haben, der Listener-Klassen für verschiedene Ereignistypen registriert, die in einer statischen Aufzählung wie Event_Input_KeyPressed oder Event_Game_ActorMoved definiert sind.Es speichert Ereignisse in einer Warteschlange und sendet sie an die entsprechenden Listener, die jeweils über eine Methode handleEvent(Event e) oder etwas Ähnliches verfügen.

Jedes Ereignis ist ein Objekt vom Typ Ereignis, das Daten wie seinen Ereignistyp enthält.

Meine Frage lautet: Wie sollten diese Daten dargestellt werden, da sich die Art der Ereignisdaten je nach Ereignistyp erheblich unterscheidet?Ich weiß noch nicht genau, welche Arten von Veranstaltungen ich in Zukunft erstellen möchte, daher möchte ich, dass dies so flexibel wie möglich ist.Beispielsweise könnte ein Ereignis andere Ereignisse auslösen, wenn bestimmte Bedingungen erfüllt sind (z. B.wenn der Spieler die Aktionstaste drückt, öffnet sich eine Tür (sofern der Spieler sich an einem bestimmten Ort befindet und einen Schlüssel hat).Ist XML oder Skripte eine gute Wahl?Eine andere Möglichkeit, die ich mir vorstellen kann, besteht darin, für jedes allgemeine Ereignis eine benutzerdefinierte Klasse zu erstellen, z. B. ActorEvent oder MenuEvent, aber das erscheint mir wirklich ineffizient und unflexibel.Da einige Objekte wie „Charakter“ nur sehr spezifische Ereignisse kennen müssen, z. B. wenn die Taste „w“ gedrückt wird, müssen sie meiner Meinung nach nicht benachrichtigt werden, wenn andere Tasten wie „h“ gedrückt werden.Ist es sinnvoll, so spezifische Ereignistypen zu erstellen, oder gibt es einen besseren Weg?dh.Event_Input_KeyPressed_W

Danke

War es hilfreich?

Lösung

  1. Erstellen Sie konkrete Umsetzungen Ihrer Veranstaltungen, ausgehend von der Event Basisobjekt.Erstens wird es einfacher sein, die Objekte in Ihrer Warteschlange zu verteilen, Sie müssten nur einen Schritt tun instanceof um zu bestimmen, wie mit dem Objekt umzugehen ist.
  2. Ihr Event-Listener-Code wird VIEL einfacher und strenger kontrolliert.Es besteht keine Chance, dass ein Mausereignis an ein Schlüsselereignis übergeben wird.Außerdem müssen Sie das Ereignisobjekt nicht auf Listener-Ebene testen und umwandeln
  3. Ich verstehe nicht, warum Sie keinen „gefilterten“ Ereignis-Listener erstellen können, der nur über eine bestimmte Bedingung eines bestimmten Ereignisses benachrichtigt werden möchte. Tatsächlich halte ich das für eine nette Idee.
  4. Ich würde wahrscheinlich eine Art steckbaren Versandmechanismus entwickeln.Das heißt, wenn Sie einen neuen Ereignistyp hinzufügen, müssen Sie die Warteschlange nicht aktualisieren, sondern können einfach einen neuen Dispatcher registrieren.Je nachdem, was Sie erreichen möchten, übergibt Ihre Warteschlange das Ereignis an den Dispatcher (was dem Dispatcher die Möglichkeit bietet, eine Liste der Listener abzurufen).Der Dispatcher würde feststellen, ob er weiß, wie er mit dem Ereignis umgehen soll oder nicht.Der Dispatcher würde dann das Ereignis an die erforderlichen Listener senden (und je nachdem, was Sie erreichen möchten), ein Ergebnis zurückgeben, das besagt, ob das Ereignis gesendet wurde oder nicht.

Das ist MHO

Andere Tipps

  • Wie Sie sagen, dass die Struktur verschiedener Ereignistypen unterschiedlich ist, ist es besser, für jedes Ereignis Betonklassen zu erstellen.Sie müssen keine Klasse für jeden Schlüssel erstellen!Aber im Allgemeinen Tastaturereignisse
  • Sie sagen, dass Zeichen nur über bestimmte Schlüssel benachrichtigt werden sollten.Ich weiß nicht, was der Aufwand ist, den Charakter zu benachrichtigen, und lassen Sie dieses Objekt nicht verwandte Schlüssel ignorieren, wenn dies jedoch ein gemeinsames Muster zwischen den Klassen ist, beispielsweise haben Sie 10 verschiedene Klassen, die auf einen speziellen Satz von Tasten reagieren können, es wäre schönUm Codes nicht wiederholen und eine Dispatcher-Ebene zwischen Ereignissen und Zuhörern umzusetzen.Eine Art Verschwörer kann KeyfilterDispatcher sein, der eine Liste von Tasten empfängt und anhand dieser Filters empfängt.Eine andere Art von Dispatcher kann SEQDISPATCHER sein, der nur Zuhörer stört, wenn mehrere Ereignisse in einer bestimmten Reihenfolge berücksichtigt werden! Ich mag die steckbare Discacher-Idee, sagte Madprorammer.Vielleicht möchten Sie auch Pfeifen von Dispatchers erstellen!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top