Domanda

Sto cercando di creare un sistema di dispacciamento degli eventi centrali che utilizza un tipo di modello di osservatore per il mio piccolo progetto RPG, e ho bisogno di consigli su come meglio rappresentare i dati degli eventi.

Avrò un eventManager che registra le classi listener per diversi tipi di eventi definiti in un enum statico come event_input_keypressed o event_game_actormod. Memorizzerà gli eventi in coda e livrà agli ascoltatori corrispondenti, che ognuno ha un metodo maneggevolevent (evento E) o qualcosa del genere.

Ogni evento sarà un oggetto di tipo evento, che contiene dati come il tipo di evento.

La mia domanda è, poiché la natura dei dati dell'evento differisce considerevolmente tra i tipi di eventi, come dovrebbero essere rappresentati questi dati? Non sono ancora certo esattamente quali tipi di eventi vorranno creare in futuro, quindi voglio che questo sia il più flessibile possibile. Ad esempio, un evento potrebbe attivare altri eventi se alcune condizioni sono true (cioè. Quando il lettore ha premuto il tasto Azione, una porta si apre se il lettore è in una determinata posizione e ha una chiave). XML o script è una buona scelta? Un altro modo in cui riesco a pensare è creare una classe personalizzata per ogni evento generale, come Atorevent o Menenvent, ma questo sembra davvero inefficiente e inflessibile. Inoltre, poiché alcuni oggetti come il personaggio devono solo conoscere eventi molto specifici come quando viene premuto il tasto "W", immagino che non devono essere avvisati quando vengono premuti altre chiavi come "H". È praticabile creare tipi di eventi specifici o c'è un modo migliore? cioè. Event_input_keypressed_w

Grazie

È stato utile?

Soluzione

    .
  1. Crea implementazioni concrete dei tuoi eventi, estendendo dall'oggetto base Event. Innanzitutto, sarà più facile distribuire gli oggetti - cioè nella tua coda, è necessario eseguire solo un instanceof per determinare come gestire l'oggetto.
  2. Il tuo codice listener di eventi diventa molto più semplice e più stretto controllato. Non c'è possibilità che un evento del mouse sia passato da un evento chiave. Inoltre, non dovrai testare e lanciare l'oggetto evento al livello di ascoltatore
  3. Non riesco a capire perché non è possibile creare un ascoltatore di eventi "filtrato" che vorrà essere notificato solo di una particolare condizione di un particolare evento, infatti, penso che sia un'idea pulita.
  4. Probabilmente concederei una specie di meccanismo di dispacciamento collegabile. Ciò significa quando si aggiunge un nuovo tipo di evento, non è necessario aggiornare la coda, è sufficiente registrare un nuovo dispatcher. A seconda di ciò che potresti voler ottenere, la tua coda passerebbe l'evento al dispatcher (fornendo alcuni mezzi per il dispatcher per ottenere l'elenco degli ascoltatori). Il dispatcher determinerebbe se sa come gestire l'evento o meno. Il dispatcher spedirebbe quindi l'evento agli ascoltatori richiesti (e a seconda di ciò che si desidera ottenere), restituire un risultato che dice se l'evento è stato inviato o meno.

    È MHO

Altri suggerimenti

    .
  • Come dici che la struttura dei diversi tipi di eventi sia diversa è meglio creare classi concrete per ogni evento.Non è necessario creare una classe per ogni tasto!Ma generalmente eventi della tastiera
  • Dici che i caratteri dovrebbero essere notificati solo di tasti specifici.Non so quale sia il sovraccarico di notificare il personaggio e lasciare che l'oggetto ignorasse chiavi non correlate, ma se questo è un modello comune tra le classi ad esempio hai 10 diverse classi che potrebbero reagire a un set speciale di tasti, sarebbe belloPer non ripetere i codici e implementare uno strato di dispatcher tra eventi e ascoltatori.Un tipo di distacorri può essere KeyFilterDispatcher che riceve un elenco di chiavi e filtri eventi basati su questo.Un altro tipo di dispatcher può essere seqdispatcher che disturba solo gli ascoltatori se sono considerati più eventi in un ordine specifico! Mi piace il plubidabile Idea Distpacher Madprorammer ha detto.Inoltre potresti voler creare anche tubi di dispatcher!
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top