Ich mache ein einfaches Spiel und habe beschlossen, ein Messaging-System zu implementieren.
Das System sieht im Grunde so aus:
Entität generiert Nachricht -> Nachricht wird in die globale Nachrichtenwarteschlange gestellt -> messageManager benachrichtigt jedes Objekt über die neue Nachricht über onMessageReceived (Nachrichtennachricht) -> wenn das Objekt dies wünscht, wirkt es auf die Nachricht.
Die Art und Weise, wie ich Nachrichtenobjekte erstelle, ist wie folgt:
//base message class, never actually instantiated
abstract class Message{
Entity sender;
}
PlayerDiedMessage extends Message{
int livesLeft;
}
Jetzt kann meine SoundManagerEntity in ihrer onMessageReceived () -Methode so etwas tun
public void messageReceived(Message msg){
if(msg instanceof PlayerDiedMessage){
PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg;
if(diedMessage.livesLeft == 0)
playSound(SOUND_DEATH);
}
}
Die Profis dieses Ansatzes:
- Sehr einfach und leicht zu implementieren
- Die Nachricht kann so viele Informationen enthalten, wie Sie möchten, da Sie einfach eine neue Nachrichtenunterklasse erstellen können, die alle erforderlichen Informationen enthält.
Die Nachteile:
- Ich kann nicht herausfinden, wie ich Nachrichtenobjekte in einen Objektpool recyceln kann , es sei denn, ich habe für jede Unterklasse von Nachrichten einen anderen Pool. Ich habe also im Laufe der Zeit sehr viel Objekterstellung / Speicherzuweisung.
- Ich kann keine Nachricht an einen bestimmten Empfänger senden, aber das habe ich in meinem Spiel noch nicht gebraucht, daher macht es mir nichts aus.
Was fehlt mir hier? Es muss eine bessere Implementierung oder eine Idee geben, die mir fehlt.