2011-12-14 33 views
1

我正在研究Java中的第一人稱遊戲,並試圖讓3D移動工作。檢測Java中的3D第一人稱世界的鼠標移動

我的問題是我想捕捉鼠標移動,但保持鼠標在窗口內。捕捉到鼠標移動後,我認爲將鼠標放在窗口中的最佳方式是使用Robot.moveMouse(x,y)將鼠標移動到窗口中心。這很好,但是從機器人的移動觸發我的窗口中的事件,然後被解釋爲正常事件,從而移動我的角色在世界上。

我已經嘗試過保持狀態和忽略運動的各種方案,直到我處於中心位置,但他們都似乎很挑剔,並且不太清楚哪些事件是用戶vs機器人控制的。

有沒有一種簡單的方法來檢測到鼠標移動來自機器人?

是否有更簡單的方法可以解決我忽略的問題?

回答

0

我解決了這個問題,切換到NEWT與JOGL 2.0 RC4。特別是,我使用GLWindow和warpPointer代替了Robot.mouseMove的AWT框架。隨着開關,我立即得到平穩的動作。一些示例代碼類似於我在做什麼(里程可能會有所不同):

public class MyClass implements MouseListener { 
    private GLWindow window; 
    private int centeredX = -1; 
    private int centeredY = -1; 

    // ... 

    public void mouseMoved(MouseEvent e) { 
     if (centeredX == -1 || centeredY == -1) { 
      center(); 
      return; 
     } 

     int deltaX = e.getX() - centeredX; 
     int deltaY = e.getY() - centeredY; 

     // ... Do something with the deltas 

     centeredX = window.getWidth()/2; 
     centeredY = window.getHeight()/2; 
     window.warpPointer(centeredX, centeredY); 
    } 
} 
0

嗯,我不是100%這個,但你有沒有在你的鼠標事件上使用getsource()getComponent()函數?他們可能會返回機器人作爲其來源。除此之外,我會有一個像boolean robotControlling這樣的類變量,並且只要控制鼠標,就將其設置爲true。然後,在你的mouseListener中,做一個if(!robotControlling){...}。希望這可以幫助。編輯:如果您的應用程序中有未使用的鼠標按鈕(Java具有按鈕1,按鈕2和按鈕3),則可以讓機器人按下該按鈕,並在您的鼠標偵聽器中忽略按下該代碼的任何事件。 (爲此使用evt.getButton())當然,這不完全是最乾淨的解決方案:P

+0

感謝您的迴應!不幸的是,getSource返回事件發生的地方(我懷疑getComponent是相似的)。我已經嘗試了像你描述的那樣設置狀態,但它似乎並不可靠,並以奇怪的行爲結束。我甚至嘗試過使用類似於按下按鈕描述的東西,但仍然以不可靠的行爲結束。也許我在這些方法上做了錯誤的事情,但我似乎得到了機器人與人類的混合事件,並最終忽視了我不應該做的事情,反之亦然。 – 2011-12-14 07:53:11