Sto realizzando un gioco semplice e ho deciso di provare a implementare un sistema di messaggistica.
Il sistema appare sostanzialmente così:
L'entità genera un messaggio -> il messaggio viene pubblicato nella coda globale dei messaggi -> messageManager notifica ogni oggetto del nuovo messaggio tramite onMessageReceived (Messaggio msg) -> se l'oggetto lo desidera, agisce sul messaggio.
Il modo in cui sto creando oggetti messaggio è così:
//base message class, never actually instantiated
abstract class Message{
Entity sender;
}
PlayerDiedMessage extends Message{
int livesLeft;
}
Ora il mio SoundManagerEntity può fare qualcosa del genere nel suo metodo onMessageReceived ()
public void messageReceived(Message msg){
if(msg instanceof PlayerDiedMessage){
PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg;
if(diedMessage.livesLeft == 0)
playSound(SOUND_DEATH);
}
}
I pro di questo approccio:
- Molto semplice e facile da implementare
- Il messaggio può contenere tutte le informazioni che desideri, poiché puoi semplicemente creare una nuova sottoclasse di messaggi con tutte le informazioni necessarie.
I contro:
- Non riesco a capire come posso riciclare gli oggetti Message in un pool di oggetti , a meno che non abbia un pool diverso per ogni sottoclasse di Message. Quindi ho un sacco di creazione di oggetti / allocazione di memoria nel tempo.
- Non riesco a inviare un messaggio a un destinatario specifico, ma non ne ho ancora avuto bisogno nel mio gioco, quindi non mi dispiace troppo.
Cosa mi sto perdendo qui? Ci deve essere una migliore implementazione o qualche idea che mi manchi.