Я делаю простую игру и решил попробовать внедрить систему обмена сообщениями.
Система в основном выглядит так:
Объект генерирует сообщение -> сообщение отправляется в глобальную очередь сообщений -> messageManager уведомляет каждый объект о новом сообщении через onMessageReceived (Message msg) -> если объект хочет, он воздействует на сообщение.
То, как я создаю объекты сообщений, выглядит так:
//base message class, never actually instantiated
abstract class Message{
Entity sender;
}
PlayerDiedMessage extends Message{
int livesLeft;
}
Теперь мой SoundManagerEntity может сделать что-то подобное в своем методе onMessageReceived ()
public void messageReceived(Message msg){
if(msg instanceof PlayerDiedMessage){
PlayerDiedMessage diedMessage = (PlayerDiedMessage) msg;
if(diedMessage.livesLeft == 0)
playSound(SOUND_DEATH);
}
}
Плюсы к этому подходу:
- Очень просто и легко реализовать
- Сообщение может содержать столько информации, сколько вы хотите, потому что вы можете просто создать новый подкласс Message, в котором есть вся необходимая информация.
Минусы:
- Я не могу понять, как я могу переместить объекты Message в пул объектов , если у меня нет другого пула для каждого подкласса Message. Таким образом, у меня есть много-много объектов создания / выделения памяти с течением времени.
- Не могу отправить сообщение конкретному получателю, но мне это еще не нужно в моей игре, поэтому я не против этого.
Что мне здесь не хватает? Должна быть лучшая реализация или какая-то идея, которую мне не хватает.