0

ここで同様の回答を見つけることができませんでしたが、これが私自身の問題に固有すぎる場合はお詫びします。

コマンドラインインターフェイスとGUI(コマンドラインフラグを使用してアクティブ化)の両方を備えたJavaを使用して、単純なゲームを構築しています。ゲームの記述方法では、ゲーム ロジック (モデル) には入力 (コントローラー) と出力 (ビュー) への参照がありますが、入力にも出力にもモデルへの参照はありません (これは要件でした)。したがって、ゲームの流れは、次のようなアプリケーション モデルのループによって制御されます。

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

このための Swing GUI を構築しようとしているので (私が経験したことはありません)、イベントのリッスンでどのように機能するかを確認するのに苦労しています。ボタンが押されたときに (新しいゲーム、ゲームの保存、ゲームの終了など)、InputType がモデルに送信され (基本的にはコメント行と同じことを行います)、それに応じて処理されるように機能することが理想的です。ただし、モデルへの参照を保持していない場合は、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 に答える