2016-11-22 20 views
0

我在這裏找不到任何類似的答案,但是如果這對我自己的問題太具體,我表示歉意。如果控制器沒有對模型的引用,您可以爲MVC風格的遊戲構建Swing GUI嗎?

我正在構建一個使用Java的簡單遊戲,它具有命令行界面和GUI(使用命令行標誌激活)。遊戲編寫的方式是遊戲邏輯(Model)具有對輸入(Controller)和輸出(View)的引用,但輸入或輸出都沒有對模型的引用(這是一個要求)。因此,遊戲的流程是通過應用模型類似於環控制:

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

現在我想建立這樣的Swing GUI的(不是我有經驗),我很努力看看它如何與事件聆聽一起工作。理想情況下,當按下按鈕(新遊戲,保存遊戲,退出遊戲等)時,將會向模型發送一個InputType(基本上與註釋行相同)以進行相應處理。但是如果它不包含對模型的引用,它就不能'發送'InputType。我想我正在建立一個與模型「詢問」輸入有關的GUI,而不是「聆聽」它。

這可能嗎?如果是這樣,任何人都可以提供任何有用的資源來解決這個問題嗎?如果不是,可以提供解釋或可能的替代解決方案建議。

+1

*該遊戲被寫入的方式是,遊戲邏輯(型號)具有到所述輸入(控制器)和輸出(查看)的引用,但不與輸入或輸出具有參考到模型(這是一個要求)。*這是從MVC模式向後。 MVC模式背後的想法是模型不瞭解視圖和控制器,因此您可以從同一模型創建不同的視圖。 –

+0

對於[示例](http://stackoverflow.com/a/3072979/230513)。 – trashgod

回答

1

我不會考慮你的流量是對還是錯。

  • 在輸入中創建事件隊列。然後,監聽器可以將事件添加到隊列中。然後,Model可以詢問Input是否存在未處理的隊列中的事件,並根據發生的事件執行操作。讓模型持有對視圖接口的引用,調用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); 
    } 
    } 
    
+0

謝謝,這似乎是一個很好的解決方案:) –

相關問題