2016-05-10 5 views
-1

私は忙しくしているゲームでは、JPanelに比べて常にマウスのxとyの値を持つ必要があります。つまり、paintComponentメソッドが呼び出されるたびに値を更新する必要があります。私はmouseMoved()とmouseDragged()を使用しましたが、Graphics自体を翻訳しているので、私は常にそれをリフレッシュする必要があります。マウスリストにメソッドを作成せずにマウスのxとyの値を取得する方法がありますか?イベントを必要とせずに、マウスのxとyの位置をJPanelに対して常に更新する方法はありますか?

+2

これを行う方法は間違いなくあります(変数に 'mouseMoved'イベントの位置を保存し、アクセサを提供し、独自の' MouseListener'を実装)。しかし、あなたが何を記述しているかのように正しく聞こえないので、なぜあなたが継続的に更新する必要があるのか​​について、より多くの情報を聞きたいと思います。 – user2478398

+0

@ user2478398ポケモンのように、プレーヤーは常に中央にありますが、歩いているときはプレーヤーの周りのすべてが動きます。私のゲームはあなたが撃つことができる以外は似ています。弾丸はマウスに行きます。プレイヤーがカーソルを移動せずに1つの地点に置くことを決定し、矢印キーを使用して攻撃すると、xとyの座標は最初のクリックからの古いものなので、ターゲティングシステムは機能しません。 –

答えて

0

マウスリスナーにはMouseEventがあり、そこからマウスの位置を取得できます。

class MyMouseListener extends MouseMotionAdapter { 
    @Overrride 
    public void mouseDragged(MouseEvent e) { 
     int mouse_x = e.getX(); 
     int mouse_y = e.getY(); 
     // ... use mouse_x & mouse_y 
    } 
} 

注:#paint(Graphics g)メソッドで必要な場合は、このマウスの場所を保存する必要があります。 Windowsオペレーティングシステムで#paint(Graphics g)呼び出し中にマウスの位置を問い合わせることができるかもしれませんが、私はMac OSで「ロックアップ」を経験しています。したがって、マウスのリスナーにマウスの位置を保存し、ペイントメソッドで保存された位置を使用します。

+0

私の状況では、マウスを使わずにマウスの位置を取得する必要があるという問題があります。私は、敵をターゲットにする方法としてマウスポインタを使用するゲームを作っています。左または右に飛んでいると、グラフィックス全体が逆に変換されます。つまり、マウスを押したままにして、キーで左右に操作すると、xとyの値は更新されません。 –

+0

グラフィックスを移動してもマウスの位置は変わりません。 [逆変換](https://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html#inverseTransform%28java.awt.geom.Point2D,%20java)を適用する必要があります。 .awt.geom.Point2D%29)をマウス/スクリーン座標にドラッグしてモデル座標系に変換します。 – AJNeufeld

+0

私はすでに持っています。ターゲットシステムは、カーソルを1点に向けた状態で拘束(左右に移動)しない限り、すべての状況で機能します。これは、マウスが画面に対して移動していても、実際の動きは検出されていないため、最初のクリックで記録されたx値が最新の更新値であったためです。私はそれがプログラムの進行中に常に更新されるようにしたいと思います。移動したりドラッグしたりしたときだけではありません。 –

0

MouseInfo.getPointerInfo()。getLocation()を試すことができます。 画面に対してマウスポインタの位置を返します。 PointerInfo

サンプルコードについて より:

PointerInfo relative = MouseInfo.getPointerInfo(); 
Point coord = relative.getLocation(); 
int x = (int) coord.getX(); 
int y = (int) coord.getY(); 
1

は、私はあなたがこのための独自の方法を見つけたことを承知しているが、ちょうど答えとして解決策を提供します。

画面のPoint取って、あなたのゲームの座標系への変換を扱うAimerclassのいくつかのフォームを持っている、とマウスが移動するたびに更新しますMouseListenerにそれを与えます。これにより、マウスの現在の画面は常にPointになりますが、ゲーム内の座標への変換は他の場所で処理されます。このような

何か:

public class AimingMouseListener extends MouseAdapter { 

    private final Aimer aimer; 

    public AimingMouseListener(Aimer aimer) { 
     super(); 
     this.aimer = aimer; 
    } 

    @Override 
    public void mouseMoved(final MouseEvent e) { 
     aimer.setCurrentMousePoint(e.getPoint()); 
    } 
} 
関連する問題