2013-06-17 9 views
5

Il mio livello/vista dell'applicazione ha un sistema di invio eventi noto anche come lavagna. In esso gli ascoltatori sono memorizzati da una hashmap con chiavi che sono tipi di eventi implementati come un enum EventType e valori che sono i riferimenti listener che ascoltano questo tipo di evento. Per esempio. un oggetto modello sta ascoltando il tipo di evento "LOCAL_PLAYER_INPUT", processi di lavagna e notifica al giocatore poiché il giocatore implementa l'interfaccia EventHandler.Gestione eventi incapsulata con Enum

Vorrei disaccoppiare ulteriormente il mio modello implementando una lavagna standalone per modello. Verrà quindi aggiunto come listener alla lavagna del livello dell'applicazione poiché il livello dell'applicazione sta rilevando l'I/O da tastiera o touch. La lavagna modello di per sé delegherà ulteriormente gli eventi. Per questo ho voluto creare una gerarchia enum dove l'evento è classificato in questo modo:

MODEL.LOCAL.PLAYER_INPUT 

modello sarebbe registrato come ascoltatore in vista lavagna solo passando modello come questo:

addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType) 

By combinando le interfacce con le enumerazioni che ho raggiunto, posso scrivere eventtype come MODEL.XY ma non sarà accettato da addListener sebbene MODEL stia implementando l'interfaccia EventType.

Cosa devo fare?

EDIT: Alcuni più codice

addListener Metodo:

public void addListener(EventHandler handler, EventType eventType) { 
    getListener(eventType).add(handler);} 


private Array<EventHandler> getListener(EventType eventType) { 
    if(map.containsKey(eventType)) 
     return map.get(eventType); 
    else { 
     Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class); 
     map.put(eventType, tmp); 
     return tmp; 
    } 

} 

enumerazioni:

public interface WL extends EventType { 

public static enum LOCAL { 
    PLAYER_INPUT, 
    NPC_INPUT 
} 

}

GameEvent:

public GameEvent(EventType eventType, Object message) { 
    this.eventType = eventType; 
    this.message = message; 
    timeStamp = System.currentTimeMillis(); 

} 
+0

Poiché le tue chiavi sono enumerate, dovresti prendere in considerazione l'uso di un 'EnumMap'. Anche se credo che questo non sia davvero un aspetto critico qui – fge

+0

Questo è un bel consiglio, lo implementerò, grazie! –

+0

Qualche altro codice sarebbe utile. Come appare il tuo enum, di cosa si lamenta il compilatore? – lost

risposta

0

MODEL.LOCAL.PLAYER_INPUT non è di tipo EventType anche se MODEL è. Poiché l'enum è una classe interna di MODEL, il suo tipo è attual- mente LOCAL.

public interface WL extends EventType { // Your interface WL is EventType 

    public static enum LOCAL { // Your enum is type LOCAL because there are no extensions 
     PLAYER_INPUT, 
     NPC_INPUT // Your enum constants represents something of type LOCAL 
    } 
} 

Si potrebbe cambiare per:

public enum WL implements EventType { // Your interface WL is EventType 

    public static enum LOCAL implements EventType { // LOCAL is now EventType 
     PLAYER_INPUT, 
     NPC_INPUT // So are the enum constants 
    } 
} 

Il problema è che, se si ora si riferiscono a WL.LOCAL, è di tipo sarebbe sicuro Class (non al 100% su questo uno ma non è deffinetly EventType. Potrebbe non essere nemmeno compilato in modo accidentale). Dovresti dichiarare LOCAL come costante di enum per accedervi in ​​quel modo. Purtroppo non c'è modo di farlo se entrambi dovessero avere lo stesso nome.

Se non mi manca qualcosa, dovresti trovare una soluzione completamente diversa. Potrebbe non essere la risposta che stavi cercando, ma era troppo lungo per essere inserito in un commento.

+0

Grazie per la risposta. Ora sto andando in questo modo: Poiché enum WL (questo è l'abbreviazione di WorldLogic, questo è il nome per il mio modello) è di tipo WL Potrei fare un controllo getClass() e tutto ok. Aggiungi alla mia lavagna un metodo addListener sovraccarico che aggiunge gli ascoltatori alla ricerca di una classe speciale e il gioco è fatto. –

Problemi correlati