-1

編集:私が言ったことすべてを気にしないでください!!!

ループをまったく使用する必要がないことに気付きました。GUI をセットアップする各メソッドは、それが完了するとすぐに終了し、その後プログラム全体がボタンを押すのを「待機」します。メソッドを設定するだけで、必要に応じて「ループ」できるようになります。

正しく説明できているかどうかわかりませんが、うまくいくと思います。とにかく助けてくれてありがとう!

安全のために、もう 1 つ質問があります。「main()」メソッドでメイン ウィンドウをセットアップすると、プログラムは、セットアップした特定の条件 (つまり、プレイヤーが死ぬ) に達した場合にのみ終了します。それ自体で「終了」しませんか?


さて、ここに私の問題があります:

GUI として Swing を使用する非常に原始的な RPG に取り組んでいます。これは、それを機能させるために大量のメソッドが必要であり、(物事を単純にするために) 少数のボタンですべてを制御する必要があることを意味するため、一定数のボタンのみを使用し、いくつかの異なる ActionListeners を作成することにしました。 . 特定のメソッドが呼び出されると、必要な数のボタンを「表示」に設定し、それらのテキストを設定し、適切な ActionListeners をそれらに割り当てることにより、GUI をセットアップします。

以下に例を示します (プレイヤーが NPC と戦う):

public int Combat(NPC e){
    game.setButtons(0, true, "Attack", 1);
    game.setButtons(1, true, "Ability", 1);
    game.setButtons(2, false, "", 1);
    game.setButtons(3, false, "", 1);
    game.setButtons(4, false, "", 1);
    game.setButtons(5, true, "Flee", 5);

    while(e.gethp() > 0 && this.hp > 0){
        if (!game.getProceed())
            break;

    }
    if (e.gethp() <= 0)
        return 1;
    else if(hp <= 0)
        return 2;
    else return 3;
    }

(「セットボタン」:)

public void setButtons(int b, boolean v, String s, int act){
    button[b].setVisible(v);
    button[b].setText(s);
    switch(act){
        case 1: button[b].addActionListener(comlist[b]); break;
        case 2: button[b].addActionListener(maplist[b]); break;
        case 3: button[b].addActionListener(loclist[b]); break;
        case 4: button[b].addActionListener(invlist[b]); break;
        case 5: button[b].addActionListener(mainlist[b]); break;
        case 6: button[b].addActionListener(playlist[b]); break;
        case 7: button[b].addActionListener(intlist[b]); break;
        case 8: button[b].addActionListener(proc); break;
    }
}

(「CombatListener」:)

class CombatListener implements ActionListener{

    int but_num;

    public CombatListener(int n){
        but_num = n;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        player.CombatAction(but_num);           
    }

}

(私が設定したもう 1 つのリスナーは、"Proceed" リスナーです。これにより、ゲーム内のブール値の "proceed" 変数が false に設定されます。メニューを前のものに戻す、またはこの場合: 戦闘から逃げる. これが、その while ループに設定した理由ですが、これが正しい方法であるかどうかはわかりません.)

これが意味をなすためにどれだけのコードを提供する必要があるのか​​ わかりません(全体が信じられないほど巨大です)。必要に応じて、すべてここに投稿します。

私の質問: プログラムが「戦闘」メソッドに入ったときに、ボタンを使用してコマンドを実行している間、そこにとどまることができるようにするにはどうすればよいですか? ここでの複雑な点は、これらのボタンがしばしばプログラムに追加のメソッドを入力させ、別の方法で GUI をセットアップする可能性があることです。これらのメソッドが完了したら、GUI を「リセット」して前のメソッドで動作させる必要があります。

私はそれがすべて理にかなっていることを願っています... :)

4

2 に答える 2

2

SWING アプリケーションでは、いわゆる「メイン ループ」を制御することはできません。

したがって、SWING アプリケーションでは、「ユーザーの入力を待つ、処理する、ループする」などのことは行いません。

SWING アプリケーションは、好みに応じて「イベント駆動型」または「ステート マシン」です。ユーザー入力を処理するイベント ハンドラーを設定する必要があります。次に、入力 X または Y を指定すると、アプリケーションはそれに応じて状態を進化させる必要があります。

たとえば、ターン制の戦闘ゲームを考えてみましょう。プレイヤーの移動中は「プレイヤー移動状態」、敵の移動中は「敵移動状​​態」となります。「プレイヤー移動状態」では、アプリケーションは対話を提供し、「敵移動状​​態」に遷移するよりもユーザーの選択に反応し、その後何かが発生します。「プレイヤー移動状態」に入った後、ユーザーの入力の前にメソッドはありません。アクティブで、読み取りまたは書き込み時にループがブロックされていません。アプリケーションは、何らかのハンドラーがアクティブになるのを待っている「アイドル」状態です。

于 2012-11-27T15:36:13.373 に答える
0

メソッドがボタンの押下によって呼び出される場合は、そのイベントがトリガーされたときに目的のボタンを表示するように条件を設定する必要がある ActionListener にそのイベントを送信します。

void actionPerformed(ActionEvent e) {
    btn1.setVisible(true);
    btn2.setVisible(true);
    btn3.setVisible(false);
    }
}
于 2012-11-27T15:36:09.957 に答える