Estou fazendo um jogo simples e decidi tentar implementar um sistema de mensagens.
O sistema basicamente se parece com isso:
A entidade gera a mensagem -> a mensagem é postada na fila de mensagens global -> messageManager notifica todos os objetos da nova mensagem através de onMessageReceived (Message msg) -> se o objeto desejar, ele atua na mensagem.
A maneira como estou criando objetos de mensagem é assim:
//base message class, never actually instantiated
abstract class Message{
Entity sender;
}
PlayerDiedMessage extends Message{
int livesLeft;
}
Agora meu SoundManagerEntity pode fazer algo assim no método onMessageReceived ()
public void messageReceived(Message msg){
if(msg instanceof PlayerDiedMessage){
PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg;
if(diedMessage.livesLeft == 0)
playSound(SOUND_DEATH);
}
}
Os profissionais dessa abordagem:
- Muito simples e fácil de implementar
- A mensagem pode conter as informações que você desejar, porque você pode apenas criar uma nova subclasse de Mensagens com as informações necessárias.
Os contras:
- Não consigo descobrir como reciclar objetos Message para um pool de objetos , a menos que eu tenha um pool diferente para cada subclasse de Message. Portanto, tenho imensas criações de objetos / alocação de memória ao longo do tempo.
- Não consigo enviar uma mensagem para um destinatário específico, mas ainda não precisei disso no meu jogo, por isso não me importo muito.
O que estou perdendo aqui? Deve haver uma implementação melhor ou alguma idéia que estou perdendo.