Можете ли вы создать 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); } }