2009-08-06 12 views
0

私は、Javaでグリッドベースのsimゲームを開発しています。次のことを行う標準的な方法があるかどうか疑問に思っていました。 私はゲームパネルであるパネルを持っており、パネルをクリックしたときに起こり得る多くの異なることがあります。たとえば、部屋を構築するときに、マウスをドラッグして左クリックすると、異なる動作が行われるいくつかの段階があります。 今、私がやったやり方は、何が構築されているかを確認するためにブール値を使用し、それがどの段階にあるかです。javaのマウスイベントのさまざまなオプションを処理する標準的な方法はありますか?

このような処理方法はありますか?私は速いgoogleを持っていましたが、前にも述べたように、スタックオーバーフローの人々は常に、より良い、より関連性の高い、最新の回答を提供します。

私は自分自身をまだJavaではなく新しいものと考えています。

ありがとうございます。

答えて

3

戦略パターンに似たものを試してみるとよいでしょう。

基本的には、まずツールバーのルームボタンをクリックします。ツールバーが表示され、グリッドは「ルームプレース」のアクションリストを使用するよう指示します。あなたが部屋を構築する複数のステージを持っている場合はおそらくなど、

を、部屋の場所のActionListenerが今度は右/左クリックのためのロジックのすべての興味深いビットを実装し

を聞いていた以前のアクションリスナーを削除ドラッグ(例えば、ドアを置き、窓をつけてからドアをはずす)。アクションリスナーは、次の段階に制御を渡す責任があります:有限状態機械のビット。

「ルーム」ボタンをクリックして開始し、「プレイスルーム」リスナーが追加されました。ルームを配置するエリアをドラッグアウトします。「プレイスルーム」はゲームの状態を変更し、アクションリスナを「プレイスウィンドウ」のリスナに変更します。あなたが終わるまで、広告は無限になります。

1つの非常に簡単な(非コンパイル)例:あなたは、一般的にあなたのゲームモデルとグラフィックインターフェースを組み合わせることにしたくない:

class GridPanel extends JPanel 
{ 
    void SetMouseListener(MouseListener newListener) 
    { 
     for(MouseListener ml : getMouseListeners()) 
      removeMouseListener(ml); 
     addMouseListener(newListener); 
    } 
} 

class ControlPanel extends JPanel 
{ 
    GridPanel gameGrid; 

    void OnRectangleButtonClicked(some stuff) 
    { 
     gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid)); 
    } 
} 

class PlaceRoomListener extends MouseAdapter 
{ 
    GridPanel gameGrid; 

    //constructor, etc 

    void OnClick(mouse event) 
    { 
     gameGrid.doCoolStuff(); 
     gameGrid.SetMouseListener(new PlaceTrapDoorListener()); 
    } 
} 

//etc 

さて、余談非コンパイル例という、Pyrolisticalはポイントを持っていますクラスの1つのグロブ。モデルをGUIから切り離し、明確に定義されたインターフェースを通してモデルを操作する必要があります。

+0

これは興味深いと思います。このpattenが実装されているすべての例に私をリンクできますか?それとも私がそれを見つけるのに十分一般的なのでしょうか? 私は最近、他のロジックのファクトリメソッドpattenをもう一つ表示しましたが、実際にはこの質問には関係しません。面白いことに、たくさんの確立された方法があります:) – Relequestual

+1

http://ja.wikipedia.org/wiki/Strategy_patternしかし、それは基本的には「共通のインターフェースを実装して、異なることをする実装を入れ替えたり入れ替えることができる」ということです。ここでの私の使用は無効かもしれませんが、それは意図的に十分に近いと思います。 – CoderTao

+0

ありがとう、これは面白いです。それはそれを行う方法かもしれません。前にアクションリスナーでやったことがありますか?あなたは推測していますか?私はこれがどのように実装されるのか考えようとしています。私はそれを動作させることができると思うが、私はむしろ眠っている:)。私は本質的には、ブーリアンを使って粗雑な方法でこれをやっていたと思うが、この戦略を使用すると、パタンはそれを行うためのはるかに良い方法のように見える。 – Relequestual

0

あなたのゲームモデル/状態を定義し、それをマウスの操作とは別にする必要があるようです。

MVCを使用していますか?

+0

私は怖い私にはわからない

(また、その後、マウスリスナーを削除するだけでランダムにすべてのリスナーを削除するについて行くためのより良い方法はおそらくあります...私は、申し訳ありませんラッシュのビットでした)どのMVCが... – Relequestual

+0

今すぐ学ぶのは楽しい時です。 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller –

+0

その場合、私は私がいると信じています。私はそのように言われたことは聞いたことがない。 マウスイベントが処理され、データが操作され、その変更がユーザーに表示されます。本質的に、ほとんどのデスクトップアプリケーション(特にゲーム)はこのように動作しませんか? – Relequestual

関連する問題