Mobil cihazlarda SDL2 olaylar

oy
1

Nedeniyle bir davranışa böcek olan birkaç saat için mücadele ettik SDL2 ben hiçbir şey bilmiyordum hangi.
Özellikle, kullanıcı ekrana dokunduğunda mobil, iki olay gönderilir, bunu bilmiyordu:

  • İlki bana oldukça açıktı: Bir parmak aşağı olay .
  • : Ikincisi gerçekten az belirgin oldu bir fare düğmesi aşağı olay .

Aynı parmak yukarı / fare düğmesi yukarı olaylar için de geçerlidir.
Bunlardan bir iç komut atıldı Çünkü iki kez bana bir ağrıttı.

Hedef sorusuna amacına dışındaki nedenlerden dolayı hem mobil hem de masaüstü ortamları desteklemektir.
Ayrıca, ben tahmin edebilirsiniz SDL2 zaten mevcut kod temeli düzgün göçünü desteklemek amacıyla böyle çalışır.

Neyse, bir (beni diyelim) bulunmaktadır SDL2 yönlü mobil fare ilgili olayları engellemek için?

Doğrusu, onlar benim açımdan çok şey anlam ifade etmeyen ve ben yazılım bir masaüstü ortamına yürütüldüğünde sürece, onlardan kurtulmak istiyorum.
Ayrıca, ben istemiyorum, ne zaman parametreleri derleme kullanmak ne de amacı olan mobil cihazlarda bu etkinlikleri bastırmaktır kod adanmış parça var.

Kod oldukça basit. bir (belki) anlamlı düşük, örneğin aşağıda belirtilmiştir:

SDL_Event ev;
while(SDL_PollEvent(&ev)) {
    switch(event.type) {
    case SDL_FINGERDOWN:
        // read it and throw an internal event E
        break;
    case SDL_MOUSEBUTTONDOWN:
        // read it and throw an internal event E
        break;
    }
}

açıklandığı gibi kullanıcı, ekrana dokunduğu zaman maalesef yukarıda her iki etkinlik okunur.

* DÜZENLE *

Ben bir Android cihazda başvurumu test ve ben aynı sorunu iOS'ta doğar emin olmak için uzak olduğumu bahsetmedi.
Aşağıdaki yanıtı bakın. O gerçekten de görünüyor konu (şimdiye kadar bunu anladığınız tam olarak değil bir sorun olduğunu) nedeniyle Android'de varsayılan parmak olaylardan yolu SDL2 davranır nedeniyledir.

Oluştur 25/12/2015 saat 17:21
kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Ne yazık ki, böyle bir platforma özel deaktivasyon parametre vardır.

bunu yapmak için temiz yolu bu nedenle sıraya konmuş fare olaylarını engeller SDL_GetPlatform platforma () ve mobil eğer SDL_SetEventFilter (bir eventfilter grubu) için sorgulamak için başlatma kodu olabilir. Bu tam olarak beklediğiniz cevap değil, ama başka sdl alternatif göremiyorum.

Daha basit bir yaklaşım, etkinlik döngünün kodunu kontrol eğer bir bayrak yerine olay filtresi ayarlamak için olurdu ve bayrak ayarlanırsa fare olayı hiçbir şey. çok daha izole ilk alternatif var, oysa tüm kodunuzda platforma özel davranış bakmak zorunda olduğu bu ikinci yaklaşım ise o kadar temiz değil.

Cevap 25/12/2015 saat 20:01
kaynak kullanıcı

oy
1

Gerçekten bir olay filtresi eklemek için Christophe fikir gibi olsa bile, ben fark ettik SDL2 zaten bir ipucu açısından bu sorun için destek verir Android'de.

Özellikle, ipucu vardır SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH .
Bir fonksiyonu vasıtasıyla ayarlayabilirsiniz SDL_SetHint. Bkz burada daha detaylı bilgi için.

Bu kadar basit:

SDL_SetHint(SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH, "1");

Ipucu belgelerinden itibariyle varsayılan olarak ayarlandığında 0ve bunun anlamı:

Fare olayları sahte fare olaylarını yükseltecektir dokunmatik olayları ve dokunuş olarak ele alınacaktır

Bu doğru, bu ancak bunlarla ayarlayarak benim sorunum 1şu ne getirebilirim biz:

Fare olayları saf dokunmatik olaylardan ayrı olarak ele alınacaktır

Android cihazlarda Yani, artık sahte fare olaylar.

varsayılan değer sebebi benim için çok açık değildir, ama bu gerçekten bunu başarmak için doğru bir yol gibi geliyor.

DÜZENLEME (daha fazla ayrıntı)

Bu değişiklik son gibi görünüyor.
İşte onlar bu davranışı tanıtılan yama bir sonucu olarak ortaya çıkan sorunları tartışırken libsdl foruma bir bağlantıdır.
Birisi vardı aynı problem vardı ve bazıları da yama kabul edilmişti niçin da çalışıyorlardı.

DÜZENLEME: alternatif çözüm

Ipucu SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH beri mevcuttur SDL v2.0.4 , yüzden daha düşük sürümleri için tek geçerli çözüm gibi görünüyor SDL2 olay filtresi kullanmaktır.

Neyse, kullanarak platformu sorgulamak için cesaretini SDL_GetPlatformolay filtresi ayarlamak ayarlı ya da olmamak eğer karar vermek için.
Bunun yerine, her ikisinin belgelere itibaren SDL_MouseMotionEventve SDL_MouseButtonEventaraştırmalara ihtiyaç duyulmaktadır whichparametre olduğunu:

[...] gerçek fare dokunmatik giriş cihazı tarafından üretilen değil, etkinliklere ilişkin, SDL_TOUCH_MOUSEID olabilir. Eğer uygulama zaten SDL_TouchFingerEvent kolları ise, bu tür olayları görmezden isteyebilirsiniz.

Bu nedenle, ben bir olay dolayısıyla olayları sıraya veya gerekirse bunları filtrelemek için, altta yatan bir platform ne olursa olsun filtre ayarlamak için öneririz.

Cevap 26/12/2015 saat 06:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more