2016-05-10 16 views
-1

,我需要在任何时候都x和鼠标的y值,相对的JPanel。这意味着每次调用paintComponent方法时都必须刷​​新值。但是,我已经使用mouseMoved()和mouseDragged(),因为我正在翻译图形本身,所以我需要不断刷新它。是否有mouselisteners有一个方法来简单地得到您的鼠标的x和y值,而不必创建一个方法?如何不断更新鼠标相对于JPanel的x和y位置,而不需要事件?所以在游戏中,我忙着做

+2

肯定有这样做的方法(实现自己的'MouseListener'存储在'mouseMoved'事件给一个变量的位置,并提供一个访问);但我希望听到更多关于为什么需要不断更新的信息,因为这听起来不符合您的描述。 – user2478398

+0

@ user2478398将它描绘成一个小精灵游戏,玩家总是处于中心位置,但当玩家走路时,玩家周围的一切都会移动。除了可以拍摄外,我的游戏看起来很相似子弹去鼠标。如果玩家决定将他的光标放在一个地方而不移动它,并使用箭头键拍摄,则目标系统不起作用,因为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

问题出在我的情况下,我需要在没有任何鼠标的情况下获取鼠标位置。我正在制作一款使用鼠标指针作为瞄准敌人的游戏,并且向左或向右飞行会使整个图形g以相反的方式翻译,这意味着如果您按住鼠标但不移动它并瞄准通过向左或向右转动按键,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

我已经。瞄准系统适用于所有情况,除非玩家在保持光标瞄准一个点的同时进行瞄准(向左和向右移动)。这是因为虽然鼠标正在相对于屏幕移动,但没有检测到实际的动作(或拖动或点击),因此最初点击中记录的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

我知道,你说你找到你自己的方法,这一点,但只是提供一个解决方案作为一个答案。

有某种形式的Aimerclass,这与服用屏幕上Point并将其转换为游戏的坐标系统交易,并给予您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()); 
    } 
} 
相关问题