-1

私は、学習のために MVC アーキテクチャを適切に実装しようとしている Java カード ゲーム アプリケーションに取り組んできました。現在、デッキ、テーブル、およびすべてのプレーヤーのモデルを実装しています。モデルごとにビューアー クラスも作成しました。各ビューアーはそれぞれのモデルを JPanel に表示します。次に、すべてのビューアーを JFrame に配置する GameViewer クラスを作成します。

私の最上位クラスは、すべてのモデルとビューアーのインスタンスを作成する Main を呼び出します。私は現在、ActionListener クラスを使用してユーザーからのボタンのクリックを探し、それに応じてビューアーとモデルを変更するコントローラーを実装しようとしています。これを行う最善の方法については、私は混乱しています。

私のゲームの設計は非常にシーケンシャルで、ゲームはユーザーにメッセージを表示し、マウス クリックによるユーザーの入力を待ってから続行します。このため、実際のゲームをゲームが終了するまで、各反復がゲームのラウンドを表す Main の while ループ。

問題は、特定の時間にユーザーからの入力にのみ関心があることです。たとえば、ユーザーにメッセージを表示して、続行するには [OK] ボタンをクリックするように指示します。この時点では、[OK] ボタンのクリックを探しているだけなので、カードの 1 つをクリックしてもかまいません。また、ユーザーにカードを選択するように求めることもありますが、その場合はユーザーがカードをクリックするのを待っており、[OK] ボタンからのクリックには関心がありません。

ポーリングなしでこれを実装したいのですが、これを行う最善の方法がわかりません。ユーザー入力を待っている状態になった場合、ActionListener からのイベント コールバックが通知を送信するまで、wait() メソッドを使用してゲーム スレッドをスリープ状態にしますか?

それ以外の場合、Main でシーケンシャル コードを使用するのは間違っていますか? ActionListeners からのイベント コールバック内にすべてのゲーム ロジックを実装する必要がありますか?

前もって感謝します。

4

2 に答える 2

1

私のトップレベルのクラスはMainを呼び出し、すべてのモデルとビューアのインスタンスを作成します。現在、コントローラーを実装しようとしています。コントローラーは、ActionListenerクラスを使用して、ユーザーからのボタンクリックを探し、それに応じてビューアーとモデルを変更します。私はこれを行うための最善の方法については混乱しています。

私のゲームのデザインは非常にシーケンシャルで、ゲームはユーザーにメッセージを表示し、マウスクリックからのユーザーの入力を待ってから続行します。このため、実際のゲームをメインのwhileループでは、ゲームが終了するまで、各反復がゲームのラウンドを表します。

これは問題ありませんが、私が行うことは、ゲームを段階的なゲームにすることです(これの名前は忘れます)。ゲームループでは、前の状態とユーザー入力に応じてプログラムの状態を変更します。次に、プログラムの動作を状態に依存させます。これを実装するには、プログラムの状態をカプセル化する列挙型を作成し、状態設計パターンを使用して、プログラムがその状態に応じて動作を変更できるようにすることを検討してください。

問題は、特定の時間におけるユーザーからの一部の入力にのみ関心があるということです。たとえば、ユーザーにメッセージを表示し、[OK]ボタンをクリックして続行するようにユーザーに指示する場合があります。この時点では、[OK]ボタンのクリックを探しているだけなので、カードの1つをクリックしてもかまいません。また、ユーザーにカードの選択をお願いする場合もありますが、その場合は、カードをクリックするのを待っているので、[OK]ボタンからのクリックには興味がありません。

そして、ここで状態パターンが光ります。これを使用すると、ユーザーは好きな場所でクリックできるようになりますが、プログラムの状態に応じて、特定のクリックにのみプログラムが応答するようになります。

ポーリングなしでこれを実装したいのですが、これを行うための最良の方法がわかりません。ユーザー入力を待っているところまで来たら、wait()メソッドを使用して、ActionListenerからのイベントコールバックが通知を送信するまでゲームスレッドをスリープ状態にしますか?

正解-ポーリングを実行したり、wait()などのプログラムフローを停止する可能性のあるものを使用したりしないでください。

于 2013-01-06T02:19:47.343 に答える
1

Swing はイベント駆動型の環境です。これらのイベントがいつ発生するかを制御することはできません。ユーザーはプログラムの一部をクリックしたり、キーを押したりする可能性がありますが、実際にはこれを制御することはできません。

Swing は 1 つのスレッド (別名、イベント ディスパッチ スレッド) または EDT) を使用します。このスレッドをブロックするアクションは、プログラムを「ハング」させるイベントまたはペイント要求を EDT がアプリケーションに通知するのを防ぎます。

入力を簡単に制御できるコンソール プログラムのように GUI を考えることはできません。代わりに、コントロールの状態と、必要に応じてダイアログに基づいてユーザーを導く必要があります。

だから...絶対に、このスレッドをブロックする長時間実行またはブロック(IO操作など)を実行するEDTorをブロックするループを作成しないでください。

EDT 以外のスレッドから UI コンポーネントを作成または変更しないでください。

一読してみるのもいいかもしれません

于 2013-01-06T02:00:40.997 に答える