2015-06-02 15 views
6

Farenin bir masaüstünde çalışan libgdx uygulamasının penceresinin dışında olup olmadığını kontrol edebilmem gerekiyor.Masaüstünde libgdx - Pencerenin dışarısında farenin bulunup bulunmadığını belirleyin

Gdx.input.getX() ve Gdx.input.getY(), Windows'taki uygulama pencerem için kısıtlanmıştır (ancak Mac'te değil).

Ben kısıtlamasız yaratıyor Gdx.input.setCatched(true) denedik, ama aynı zamanda Uygulamama tamamen fare bağlar. Windows, farklı bir uygulamaya alt + sekme yapana kadar herhangi bir fare olayı almaz.

Ayrıca bir InputProcessor yazmayı denedim, ancak mouseMoved sadece pencerenin içine işlenecek. TouchDragged dışarıda çalışır, ancak tabii ki sadece fare düğmesine basıldığında ve pencere içinde tutulduğunda ateşlenir.

Herhangi bir yardım büyük beğeni topladı.

+0

Bunu sadece libgdx –

+0

ile mümkün olduğunu sanmıyorum "Windows üzerinde benim app penceresine kısıtlanır (ancak Mac'te)." Mac'inizde, fareniz oyun penceresinin dışındayken, ancak pencere hala odaklanmışken, daha önce bahsedilen işlevleri kullanarak fare koordinatlarını aldığınız anlamına mı geliyor? – Crembo

+0

@Crembo: Evet. Tam olarak ne demek istedim. –

cevap

2

Bir yol buldum, ama golly tarafından biraz faff. lwjgl backend Mouse.isInsideWindow() method'dan faydalanır (link için Khopa'ya teşekkürler).

sizin libgdx çekirdek modülünde bir arabirim oluşturma

kimse işte burada, ilgilenen olursa ... ...

public interface MouseWindowQuery { 

    public boolean isMouseInsideWindow(); 
} 

ana AplicationListener sınıfına bir MouseWindowQuery alan ekleme (bu olacak aşağıdaki gibi arabirim uygulayabilen masaüstü modülünde millet bir sürü için oyun genişletir) ve yere uzak kaydetmek sınıf ... Şimdi

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(); 
    } 
} 

Son olarak, DesktopStarter sınıfı (main yöntemiyle birinden) adresinin ana ApplicationListener sınıfına bu geçmektedir.

Artık ilettiğiniz örneği istediğiniz gibi kullanabilirsiniz.

bunun yerine boş bir uygulamada (sadece yanlış döndü MouseWindowQuery yani bir uygulama) geçmek zorunda kalacak diğer modülleri (örneğin Android) varsa. Eğer merak ediyorsanız

, arayüz ve uygulamalar çekirdekten masaüstünde bir bağımlılık tanıtan önlemek için gereklidir.

Phew! Umarım bu birilerine yardım eder!

+0

Bu 'Mouse.isInsideWindow()' ın ne olduğunu açıklayabilir misiniz? Libgdx API'sinde 'Mouse' sınıfını bulamıyorum. – Crembo

+0

Standart API'de yok. Bu masaüstü arka uç kavanozlarda ... gdx-backend-lwjgl.jar kesin. Bu yüzden onu sadece masaüstü kodundan arayabilirsin. –

+0

Bunu bulmak için kodun derinliklerine kazdım! :) –

İlgili konular