如果控制器没有对模型的引用,您能否为 MVC 风格的游戏构建 Swing GUI?
Can you build a Swing GUI for an MVC-style game if the Controller doesn't have a reference to the Model?
我在这里找不到任何类似的答案,但如果这对我自己的问题来说太具体了,我深表歉意。
我正在使用 Java 构建一个简单的游戏,它有命令行界面和 GUI(使用命令行标志激活)。游戏的编写方式是游戏逻辑 (Model) 具有对输入 (Controller) 和输出 (View) 的引用,但输入或输出都没有对模型的引用(这是一项要求)。因此,游戏流程由应用程序模型中的循环控制,类似于:
while (!gameFinished) {
InputType in = input.getUserInput(); //1
performAction(in);
}
既然我正在尝试为此构建一个 Swing GUI(我没有这方面的经验),我正在努力了解它如何与事件监听一起工作。理想情况下,当按下按钮(新游戏、保存游戏、退出游戏等)时,InputType 将被发送到模型(本质上与注释行执行相同的操作)以进行相应处理。但是,如果它不包含对模型的引用,则它不能 'send' InputType。我想我正在寻找构建一个 GUI,该 GUI 可以使用模型 'asking' 作为输入,而不是 'listening'。
这可能吗?如果是这样,任何人都可以为我提供任何有用的资源来解决这个问题吗?如果没有,将不胜感激解释或潜在的替代解决方案建议。
我不会去讨论你的流程是对还是错。
- 在输入中创建一个事件队列。然后,侦听器可以将事件添加到队列中。然后模型可以询问输入队列中是否有未处理的事件,并根据发生的事件执行操作。让模型持有对视图接口的引用,在 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);
}
}
我在这里找不到任何类似的答案,但如果这对我自己的问题来说太具体了,我深表歉意。
我正在使用 Java 构建一个简单的游戏,它有命令行界面和 GUI(使用命令行标志激活)。游戏的编写方式是游戏逻辑 (Model) 具有对输入 (Controller) 和输出 (View) 的引用,但输入或输出都没有对模型的引用(这是一项要求)。因此,游戏流程由应用程序模型中的循环控制,类似于:
while (!gameFinished) {
InputType in = input.getUserInput(); //1
performAction(in);
}
既然我正在尝试为此构建一个 Swing GUI(我没有这方面的经验),我正在努力了解它如何与事件监听一起工作。理想情况下,当按下按钮(新游戏、保存游戏、退出游戏等)时,InputType 将被发送到模型(本质上与注释行执行相同的操作)以进行相应处理。但是,如果它不包含对模型的引用,则它不能 'send' InputType。我想我正在寻找构建一个 GUI,该 GUI 可以使用模型 'asking' 作为输入,而不是 'listening'。
这可能吗?如果是这样,任何人都可以为我提供任何有用的资源来解决这个问题吗?如果没有,将不胜感激解释或潜在的替代解决方案建议。
我不会去讨论你的流程是对还是错。
- 在输入中创建一个事件队列。然后,侦听器可以将事件添加到队列中。然后模型可以询问输入队列中是否有未处理的事件,并根据发生的事件执行操作。让模型持有对视图接口的引用,在 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); } }