Можете ли вы создать Swing GUI для игры в стиле MVC, если у контроллера нет ссылки на модель?

Я не мог найти здесь подобных ответов, но извиняюсь, если это слишком специфично для моей проблемы.

Я строю простую игру с использованием Java, которая имеет как интерфейс командной строки, так и графический интерфейс пользователя (активируется с помощью флага командной строки). Способ написания игры заключается в том, что игровая логика (Модель) имеет ссылку на вход (Контроллер) и выход (Вид), но ни вход, ни выход не имеют ссылку на модель (это было требованием). Таким образом, ход игры контролируется циклом в модели приложения, аналогичной:

while (!gameFinished) {
    InputType in = input.getUserInput(); //1
    performAction(in);
}

Теперь, когда я пытаюсь создать графический интерфейс Swing для этого (не то, что у меня есть опыт), я пытаюсь понять, как это может работать с прослушиванием событий. В идеале это будет работать так, чтобы при нажатии кнопки (новая игра, сохранение игры, выход из игры и т. Д.) InputType отправлялся в модель (по сути, делая то же самое, что и строка комментария) для соответствующей обработки. Но если он не содержит ссылку на модель, он не может "отправить" InputType. Я полагаю, что я собираюсь создать графический интерфейс, который работает с моделью, "запрашивающей" ввод, а не "слушающей" ее.

Это возможно? И если да, может ли кто-нибудь предоставить мне полезные ресурсы для решения этой проблемы? Если нет, то будет приветствоваться объяснение или потенциальное предложение альтернативного решения.

1 ответ

Решение

Я не буду вдаваться в подробности, твой поток верен или нет.

  • Создайте очередь событий на входе. Затем слушатели могут добавлять события в очередь. Затем модель может запросить входные данные, есть ли необработанные события в очереди, и выполнить действие в зависимости от произошедшего события. Пусть модель содержит ссылку на интерфейс представления, вызывая соответствующий метод представления в методе executeAction.

Псевдокод:

    class Controller{
    Queue<UIEvent> events;

    void setupUI(){
        button.addEventListener( new EventListener(){
             Model.this.events.add(new TappedButtonEvent());
        });
    }

    UIEvent dequeueEvent(){
        if(events.size() > 0){
            return events.pop()
        }
        return null;
    }

    }

    class Model{

    public void loop(){
        while (!gameFinished) {
             UIEvent in = input.dequeueEvent();
             if(in != null){
                  performAction(in);
             }
        }
    }
    }
  • Не инкапсулируйте, как что-то отображается в Model, позвольте представлению обрабатывать это.

    interface View{
    void displayExitMessage()
    }
    
    class CommandLineView implements View{
    
    void displayExitMessage(){
        this.commandLine.append("Are you sure you want to exit(Y/N)?");
    }
    }
    
    class CommandLineView implements View{
    
    void displayExitMessage(){
        this.window.showDialog("Are you sure you want to exit?", Button.YES, Button.NO);
    }
    }
    
Другие вопросы по тегам