2016-05-10 11 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()); 
    } 
} 
相關問題