2009-07-17 17 views
6

私はJavaで単純なゲームをプログラミングしていますが、私はそれを「いい」クリーンなデザインとハックなしでしようとしています。オブジェクト指向のゲームデザインの質問

私は、クリックとキー押しを受け取る2つのクラスGamePanelと、すべてのエンティティを含み、その更新を担当するModelがあります。モデルはユーザーのマウスがどこにあるかを知る必要がありますが、私はそれを行うための「正しい」方法を決めることができません。

Model、すべてのEntityは内GamePanelへの参照を保持するか、単に最後の既知のマウスの位置をキャッシュし、定期的にGamePanelから更新を受けなければなりません。モデルが作成されたときの最初のオプションでは、GamePanelへの参照が与えられ、最後のマウス位置はWorld.update()メソッドへのパラメータとして送信されます。

どちらの解決策もエレガントではないので、これを行うための「正しい」方法があるかどうか疑問に思っていました。

ありがとう、 ベン。

+0

良い質問、+1。 –

+0

だから私はコンセンサスは、マウスの位置がObserversやEvent Listenersを必要とするだけで、マウスの位置が必要な場合、モデルをポーリングできるようにモデルにパネルへの参照を与えるのですか? –

答えて

3

私の意見では、クラスがどのように相互作用しているかによって異なります。 Modelクラスのエンティティをトリガするマウスの位置の変更ですか?またはModelクラスはGamePanelから独立していて、現在のマウス位置の値のみで動作しますか?

もし、その場合、私はjeffが私の前で言ったことに同意します。 GamePanelのハンドルを作成するときにGamePanelのハンドルをModelクラスに渡し、必要に応じてすべてのエンティティがハンドルを使用してマウス位置にアクセスできるようにします。このようにして、更新されたマウスの位置が常に使用されます。

前者の場合は、マウスの位置の値が変更されたときにModelクラスに知らせるためにObserversを使用することをお勧めします。次に、Modelクラスは同じデザインを使用できます(つまり、Modelクラスには常にGamePanelクラスのハンドルがあります)、GamePanelの現在の値にアクセスできます。

あなたの質問に対する答えをまとめると、GamePanelにマウス位置の値を保持させ、他のクラスがGamePanelインスタンスを使用してその情報にアクセスできるようにすることは論理的でOOの概念に準拠していると思います。

ありがとう、 ローハン。

2

エンティティ/モデルがそこから簡単にアクセスできるように、常に現在の座標をGamePanelのパブリックプロパティにすることができます。

1

あなたは現在のマウス位置をポーリングしたい場合は、あなたが望む任意の時点でイベントディスパッチスレッドで、このコードsnippletを実行できます。

Point pt = MouseInfo.getPointerInfo().getLocation(); 
Point cpt = GamePanel.getLocationOnScreen(); 
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y); 

そしてRELは、マウスの相対的な位置が含まれています。

JInputはキーボード/マウス/入力に対処するように設計されているため、別の方法として、JInputを見ることができます。

+0

MouseInfo since 1.5 – akarnokd

3

一般的な解決策は、イベントを発生させることです。この場合、GamePanelは、新しいマウスポジションのモデルで、関心のある(イベントに登録された)オブジェクト(エンティティ)をすべて通知するイベントを発生させます。

このように、GamePanelは通知するエンティティを明示的に知る必要はなく、エンティティはGamePanelのインスタンスを保持する必要はありません。

私のアドバイス:イベントリスナーで読んでください。 (Java.util)

+0

Java.utilとはどういう意味ですか?マウスイベントとリスナーはjava.awt.eventパッケージに含まれています。 – akarnokd

+1

どちらも正しいです。 java.awt.event.MouseListenerは、java.util.EventListener(http://java.sun.com/javase/6/docs/api/java/util/EventListener.html)を継承しています。 – Nelson

+0

私はOPがawtやswingを使用していないと想像していたので、私は彼にutilを指摘しました。 – NomeN

1

モデルは常にマウスの位置を知る必要がありますか? IE:アップデートのたびに、または特定のポイントでマウスの位置が必要ですか?

いつでも更新するたびに必要な場合は、文書化した解決策を使用するか、ここで解決する必要があります。

特定のポイントでのみ必要な場合は、それをつかんでください。 (IE:あなたのゲームがマウスのクリックに反応したら、何かをクリックしてください。)意味イベントリスナーについて読む。

幸運を祈る!希望が役立ちます。

+0

ポールベースのアプローチを使用することができるケースが1つあります。マウスをドラッグして(例えば、撮影して回って)マウスドラッグしたイベントと戦いたくない場合は、 – akarnokd

関連する問題