0

我在这里找不到任何类似的答案,但如果这太针对我自己的问题,我深表歉意。

我正在使用 Java 构建一个简单的游戏,它既有命令行界面又有 GUI(使用命令行标志激活)。游戏的编写方式是游戏逻辑(模型)具有对输入(控制器)和输出(视图)的引用,但输入或输出都没有对模型的引用(这是一个要求)。因此,游戏流程由应用程序模型中的循环控制,类似于:

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

现在我正在尝试为此构建一个 Swing GUI(不是我有经验的东西),我正在努力了解它如何与事件侦听一起工作。理想情况下,当按下按钮时(新游戏、保存游戏、退出游戏等),InputType 将被发送到模型(基本上与注释行相同)以进行相应处理。但如果它不包含对模型的引用,它就不能“发送”输入类型。我想我正在寻找一个与模型“请求”输入而不是“监听”它一起工作的 GUI。

这可能吗?如果是这样,任何人都可以为我提供任何有用的资源来解决这个问题吗?如果没有,将不胜感激解释或潜在的替代解决方案建议。

4

1 回答 1

1

我不会讨论你的流程是对还是错。

  • 在输入中创建一个事件队列。然后侦听器可以将事件添加到队列中。然后模型可以询问输入队列中是否有未处理的事件,并根据发生的事件执行操作。让模型持有对视图接口的引用,在 performAction 方法中调用适当的视图方法。

伪代码:

    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);
             }
        }
    }
    }
  • 不要封装模型中的显示方式,让视图处理它。

    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);
    }
    }
    
于 2016-11-22T18:53:50.503 回答