2015-06-02 13 views
6

Ich muss überprüfen können, ob die Maus außerhalb des Fensters meiner libgdx App auf einem Windows-Desktop ausgeführt wird.libgdx auf dem Desktop - Bestimmen, ob die Maus außerhalb des Fensters

Gdx.input.getX() und Gdx.input.getY() sind in meinem App-Fenster auf Windows beschränkt (aber nicht auf Mac).

Ich versuchte Gdx.input.setCatched(true), die es nicht eingeschränkt macht, aber es bindet auch die Maus vollständig an meine App. Windows erhält also keine Mausereignisse, bis ich Alt + Tab auf eine andere App lege.

Ich habe auch versucht, einen InputProcessor zu schreiben, aber mouseMoved wird nur innerhalb des Fensters gefeuert. TouchDragged funktioniert außerhalb, aber natürlich wird nur ausgelöst, wenn die Maustaste innerhalb des Fensters gedrückt gehalten wurde.

Jede Hilfe sehr geschätzt.

+0

Ich glaube nicht, dass das nur mit libgdx –

+0

möglich ist "sind auf mein App-Fenster unter Windows beschränkt (aber nicht auf Mac)." Meinst du das auf deinem Mac, wenn deine Maus außerhalb des Spielfensters aber das Fenster immer noch fokussiert ist, bekommst du immer noch die Mauskoordinaten mit den oben genannten Funktionen? – Crembo

+0

@ Crembo: Ja. Genau das meine ich. –

Antwort

2

Ich habe einen Weg gefunden, aber bei Golly ist es ein bisschen eine Faff. Es nutzt die lwjgl backend Mouse.isInsideWindow() method (Danke an Khopa für den Link).

Wenn jemand interessiert ist, hier ist es ...

eine Schnittstelle erstellen in Ihrem Libgdx Kernmodul ...

public interface MouseWindowQuery { 

    public boolean isMouseInsideWindow(); 
} 

hinzufügen MouseWindowQuery Feld Ihre Haupt AplicationListener Klasse (diese werden Ihnen die Klasse, die irgendwo Spiel für viele Leute) und sparen weg erstreckt ...

public class SampleApp extends Game 
{ 
    private MouseWindowQuery mouseWindowQuery; 

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

Jetzt im Desktop-Modul können Sie die Schnittstelle implementieren kann wie folgt ...

public class MouseWindowQueryImpl implements MouseWindowQuery { 

    @Override 
    public boolean isMouseInsideWindow() { 

     return Mouse.isInsideWindow(); 
    } 
} 

Schließlich passiert diese in Ihrem Haupt ApplicationListener Klasse von Ihrer DesktopStarter Klasse (die mit der main Methode).

Jetzt können Sie die übergebene Instanz verwenden, wie Sie möchten.

Wenn Sie andere Module (z. B. Android) haben, müssten Sie stattdessen eine Nullimplementierung übergeben (d. H. Eine Implementierung von MouseWindowQuery, die gerade falsch zurückgegeben hat).

Falls Sie sich wundern, die Schnittstelle und die Implementierungen sind notwendig, um eine Abhängigkeit vom Desktop vom Kern zu vermeiden.

Puh! Ich hoffe wirklich, dass das jemandem hilft!

+0

Können Sie erklären, was ist das 'Mouse.isInsideWindow()'? Ich kann die 'Mouse' Klasse in der libgdx API nicht finden? – Crembo

+0

Es ist nicht in der Standard-API. Es ist in den Desktop-Backend-Jars ... gdx-backend-lwjgl.jar um genau zu sein. Deshalb können Sie es nur über den Desktop-Code aufrufen. –

+0

Ich habe tief in den Code gegraben, um diesen zu finden! :) –

Verwandte Themen