2016-03-23 3 views
1

私はスペースをクリックすることができるゲームにマウスルック機能を追加しようとしています。キャラクターはそのスペースに移動します。JFrame/JPanelの外にあるキャンバス上の点の位置を取得する方法は?

私はマウスのXとYがJFrameの座標に関連するMouseListenerを持っています。

プレーヤーが世界を移動するとき、プレーヤーのXとYは画面上のXとYと同じではないため、これは機能しません。

JFrame上のマウスのXとYに関連するキャンバスに描かれているもののXとYを取得するにはどうすればよいですか?

+2

私は文脈のためのコードを提供していないので、あなたはウィンドウの左上隅に対する相対的な単語のx/yオフセットを知っていると仮定しますか?これであなたはマウスのx/yをウインドウから世界に戻して戻すことができます – MadProgrammer

+0

うわー、私はそれを考えなかったとは思えません。私はプレーヤーからクリックポイントまでのオフセットをしようとしています。私は次にそれを試みます。 –

答えて

3

ワールドに(x、y)の位置があり、フレームに別の(x、y)座標がある場合は、現在のカメラが世界でどこに表示されているかを確認し、違いを相殺します。

enter image description here

青色のボックスは、あなたの世界の境界とブラックボックスは、あなたのフレーム画面こととします。今すぐ位置にゲームユニットを持っているx

フレームでは、フレームに応じた座標は(x: 200, y: 300)になります。

世界の場所を取得するには、カメラの現在地を世界に追加します。つまり、(200 + 1000, 300 + 1100)です。

ゲームキャラクターの世界の所在地は(x: 1200, y: 1400)になります。

逆にするには、処理を逆にします。

1

JFrame上にあるマウスのXとYに関連してキャンバスに描かれているもののXとYを取得するにはどうすればよいですか?

ポイントを別のコンポーネントに相対的に変換する必要があります。

SwingUtilitiesクラスを確認してください。 convertPoint(...)メソッドを使用して、ポイントを任意のコンポーネントからの相対的なものに変換します。

また、Canvasクラスを使用しないでください。これはAWTで使用されます。 Swingを使用するときは、カスタムペイントにJPanelを使用する必要があります。

+0

彼らは両方とも同じコンポーネントに塗りつぶされています。最初の答えが私のために働いた。私はキャンバスクラスに関する共通の意見に同意しません。素晴らしいfpsで、私が望むすべてのものを実現することができます。現時点では、照明効果、カメラ、ズーム/スケーリングなど、256×256タイルの世界を持っていますが、まだすべてが500+ fpsです。これまでのところ、私はスイッチする理由がないと思っています... –

+0

@MitchWeaver、「最初の答えは私のために働いていました。」私は、オフセットをハードコーディングすることでうまくいかないとは言いませんでした。しかし、それは問題を解決するための適切な方法ではありません。オフセットをハードコーディングするべきではありません。オフセットは、プラットフォームによって異なる場合があります。上記のようにポイントを変換する必要があります。あなたの質問は、あなたが異なる参照点を持っていると述べました。 APIが提供するメソッドを使用し、ホイールを再作成しないでください。 – camickr

関連する問題