2015-06-02 59 views
6

我需要能夠檢查鼠標是否在Windows桌面上運行的我的libgdx應用程序的窗口之外。桌面上的libgdx - 確定鼠標是否在窗口外

Gdx.input.getX()Gdx.input.getY()僅限於我在Windows上的應用程序窗口(但不在Mac上)。

我試過Gdx.input.setCatched(true)這確實使它不受約束,但它也將鼠標完全綁定到我的應用程序。所以Windows沒有得到任何鼠標事件,直到我alt +選項卡到另一個應用程序。

我也試過寫一個InputProcessor,但是mouseMoved只能在窗口內被觸發。 TouchDragged在外面工作,但當然只有當鼠標按鈕被按下並保持在窗口內時纔會被觸發。

任何幫助非常感謝。

+0

我不認爲這是完全可能的,因爲libgdx –

+0

「僅限於Windows上的應用程序窗口(而不是Mac)」。你的意思是說,在你的Mac上,當你的鼠標在遊戲窗口之外,但窗口仍然聚焦時,你仍然使用上述函數獲得鼠標座標? – Crembo

+0

@Crembo:是的。這正是我的意思。 –

回答

2

我找到了一種方法,但通過golly,它有點兒麻煩。它利用了lwjgl backend Mouse.isInsideWindow() method(感謝Khopa的鏈接)。

如果任何人的興趣,這裏是......

創建libgdx核心模塊的接口...

public interface MouseWindowQuery { 

    public boolean isMouseInsideWindow(); 
} 

一個MouseWindowQuery字段添加到您的主AplicationListener類(這將是擴展遊戲了很多人的),並保存它什麼地方桌面模塊就可以實現界面如下類...

public class SampleApp extends Game 
{ 
    private MouseWindowQuery mouseWindowQuery; 

    public FirstLibgdxApp(MouseWindowQuery mouseWindowQuery) { 
     this.mouseWindowQuery= mouseWindowQuery; 
    } 
    ... 
} 

現在...

public class MouseWindowQueryImpl implements MouseWindowQuery { 

    @Override 
    public boolean isMouseInsideWindow() { 

     return Mouse.isInsideWindow(); 
    } 
} 

最後,在你的主ApplicationListener類從您的DesktopStarter類(一個與main法)通過此。

現在您可以使用您希望傳入的實例。

如果您有其他模塊(例如Android),則必須傳遞null實現(即實現僅返回false的MouseWindowQuery)。

如果你想知道,爲了避免引入從核心到桌面的依賴性,接口和實現是必要的。

唷!我真的希望能幫助別人!

+0

你能解釋一下這個'Mouse.isInsideWindow()'是什麼嗎?我似乎無法在libgdx API中找到'Mouse'類? – Crembo

+0

它不在標準API中。它位於桌面後端jar ... gdx-backend-lwjgl.jar中。這就是爲什麼你只能從桌面代碼中調用它。 –

+0

我深入代碼找到那個! :) –