2016-11-22 4 views
0

私はここで同様の答えを見つけることができませんでしたが、これは私自身の問題にはあまりにも特定の場合は謝罪します。コントローラにモデルへの参照がない場合、MVCスタイルのゲーム用のSwing GUIを構築できますか?

JavaでコマンドラインインターフェイスとGUI(コマンドラインフラグを使用してアクティブ化)の両方を使用する単純なゲームを構築しています。ゲームの記述方法は、ゲームロジック(Model)が入力(Controller)と出力(View)を参照していますが、入力または出力のどちらもモデルへの参照を持っていません(これは要件でした)。今、私はこのためのSwing GUI(ない何か私が経験を持っている)を構築しようとしていることを、私が苦労しています

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

:ゲームの流れは、それゆえに類似アプリケーションモデルのループによって制御され、イベントリスニングでどのように動作するかを確認してください。ボタンが押されたとき(新しいゲーム、ゲームを保存する、ゲームを終了するときなど)、InputTypeはモデルに送信されます(コメント行と同じことをやっています)。しかし、モデルへの参照を保持していない場合、InputTypeを '送る'ことはできません。私は、それを聞くのではなく、入力を求めているモデルで動作するGUIを構築しようと考えています。

これは可能ですか?もしそうなら、誰でも私にこれを解決するための有用なリソースを提供できますか?そうでない場合、説明または潜在的な代替解決策の提案が評価されます。

+1

*ゲームが書かれている方法は、ゲームロジック(モデル)の入力(コントローラ)と出力(表示)への参照を持っていますが、入力または出力のどちらも参照を持っているということです(これは必須条件でした)*これはMVCパターンから逆です。 MVCパターンの背後にあるアイデアは、モデルがビューとコントローラを認識していないため、同じモデルから異なるビューを作成できるということです。 –

+0

[example](http://stackoverflow.com/a/3072979/230513) – trashgod

答えて

1

あなたの流れが正しいかどうかは分かりません。

  • 入力にイベントキューを作成します。リスナーはイベントをキューに追加できます。モデルは、キューに未処理のイベントがあるかどうかを尋ねて、発生したイベントに応じてアクションを実行します。 modelがviewインタフェースへの参照を保持すると、performActionメソッドの適切なviewメソッドが呼び出されます。

擬似コード:

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

ありがとう、それは良い解決策のようです:) –

関連する問題