Je fais un jeu simple et j'ai décidé d'essayer d'implémenter un système de messagerie.
Le système ressemble essentiellement à ceci:
L'entité génère un message -> le message est publié dans la file d'attente de messages globale -> messageManager notifie chaque objet du nouveau message via onMessageReceived (Message msg) -> si l'objet le souhaite, il agit sur le message.
La façon dont je crée des objets de message est la suivante:
//base message class, never actually instantiated
abstract class Message{
Entity sender;
}
PlayerDiedMessage extends Message{
int livesLeft;
}
Maintenant, mon SoundManagerEntity peut faire quelque chose comme ça dans sa méthode onMessageReceived ()
public void messageReceived(Message msg){
if(msg instanceof PlayerDiedMessage){
PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg;
if(diedMessage.livesLeft == 0)
playSound(SOUND_DEATH);
}
}
Les avantages de cette approche:
- Très simple et facile à mettre en œuvre
- Le message peut contenir autant d'informations que vous le souhaitez, car vous pouvez simplement créer une nouvelle sous-classe Message contenant les informations nécessaires.
Les inconvénients:
- Je ne peux pas comprendre comment je peux recycler des objets Message dans un pool d'objets , sauf si j'ai un pool différent pour chaque sous-classe de Message. J'ai donc beaucoup, beaucoup de création d'objets / d'allocation de mémoire au fil du temps.
- Impossible d'envoyer un message à un destinataire spécifique, mais je n'en ai pas encore eu besoin dans mon jeu, donc cela ne me dérange pas trop.
Qu'est-ce que j'oublie ici? Il doit y avoir une meilleure implémentation ou une idée que je manque.