Bu konuda, şu uygulamalar için PC Üzerinde Google Play Games'de fare girişinin nasıl uygulanacağı açıklanmaktadır: giriş çeviri modunun ideal bir oyuncu deneyimi sunmadığı oyunlara göz atın.
PC oynatıcıları genellikle dokunmatik ekran yerine klavye ve fareye sahiptir. Oyununuzda fare girişi olup olmadığını dikkate almalısınız. Varsayılan olarak PC Üzerinde Google Play Games, sol tıklama etkinliklerini tek bir öğeye dönüştürür sanal dokunma etkinliği. Bu "çeviri modu" olarak bilinir.
Bu mod, birkaç değişiklikle oyununuzu çalışır hale getirse de PC oyuncularına doğal bir oyun deneyimi yaşatıyor. Bunun için şunu uygulamanız gerekir:
- İçerik menüleri için basılı tutma işlemleri yerine fareyle üzerine gelme durumları
- Uzun basıldığında veya bir bağlamda gerçekleşen alternatif işlemler için sağ tıklayın menü
- Fareye basmak yerine birinci veya üçüncü şahıs aksiyon oyunlarını sürükleme etkinliği
PC'lerde yaygın olan kullanıcı arayüzü kalıplarını desteklemek için girişi devre dışı bırakmanız gerekir çevirmeyi deneyin.
PC Üzerinde Google Play Games'in giriş işleme süreci ChromeOS PC'leri de destekleyen değişiklikler Oyununuzu tüm Android oyuncuları için iyileştirin.
Giriş çeviri modunu devre dışı bırak
AndroidManifest.xml
dosyanızda,
şunu beyan etmek:
android.hardware.type.pc
özelliği.
Bu, oyununuzun PC donanımı kullandığını ve giriş çevirisini devre dışı bıraktığını gösterir
yatırım yapmanız önemlidir. Ayrıca required="false"
ekleyerek oyununuzun
telefon ve tabletlere fare olmadan
yüklenmeye devam eder. Örnek:
<manifest ...>
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />
...
</manifest>
PC Üzerinde Google Play Games'in üretim sürümü doğru sürüme geçiyor modu açılır. Geliştirici emülatöründe çalışırken görev çubuğu simgesini sağ tıklayın, Geliştirici Seçenekleri'ni seçin ve ardından Ham fare girişi almak için PC modu(KiwiMouse).
Bunu yaptıktan sonra, fare hareketi View.onGenelMotionEvent tarafından SOURCE_MOUSE
kaynağıyla raporlanır.
Bu bir fare etkinliği olduğunu gösterir.
Kotlin
gameView.setOnGenericMotionListener { _, motionEvent -> var handled = false if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { // handle the mouse event here handled = true } handled }
Java
gameView.setOnGenericMotionListener((view, motionEvent) -> { if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { // handle the mouse event here return true; } return false; });
Fare girişini işlemeyle ilgili ayrıntılar için bkz. ChromeOS dokümanları.
Fare hareketini işleme
Fare hareketini algılamak için ACTION_HOVER_ENTER
, ACTION_HOVER_EXIT
ve
ACTION_HOVER_MOVE
etkinlikler.
Bu en iyi, kullanıcının bir penceredeki düğmelerin veya nesnelerin üzerine geldiğini kullanarak ipucu kutusu görüntüleme veya fareyle üzerine gelme durumu uygulama oyuncunun seçeceği içeriği vurgulamak önemlidir. Örnek:
Kotlin
gameView.setOnGenericMotionListener { _, motionEvent -> var handled = false if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { when(motionEvent.action) { MotionEvent.ACTION_HOVER_ENTER -> Log.d("MA", "Mouse entered at ${motionEvent.x}, ${motionEvent.y}") MotionEvent.ACTION_HOVER_EXIT -> Log.d("MA", "Mouse exited at ${motionEvent.x}, ${motionEvent.y}") MotionEvent.ACTION_HOVER_MOVE -> Log.d("MA", "Mouse hovered at ${motionEvent.x}, ${motionEvent.y}") } handled = true } handled }
Java
gameView.setOnGenericMotionListener((view, motionEvent) -> { if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_HOVER_ENTER: Log.d("MA", "Mouse entered at " + motionEvent.getX() + ", " + motionEvent.getY()); break; case MotionEvent.ACTION_HOVER_EXIT: Log.d("MA", "Mouse exited at " + motionEvent.getX() + ", " + motionEvent.getY()); break; case MotionEvent.ACTION_HOVER_MOVE: Log.d("MA", "Mouse hovered at " + motionEvent.getX() + ", " + motionEvent.getY()); break; } return true; } return false; });
Fare düğmelerini kullanma
PC'lerde uzun zamandır hem sol hem sağ fare düğmeleri kullanıldığından etkileşimli öğeler oluşturmak için hem birincil hem de ikincil işlemler. Oyunda bir ekrana dokunma gibi işlemlere dokunun. sol tıklamayla, düğmenin dokunulan ve en çok hissettiren işlemleri beklet doğal bir şekilde tıklamalıdır. Gerçek zamanlı strateji oyunlarında ayrıca kullanabileceğiniz sol tıklayın ve taşımak için sağ tıklayın. Birinci şahıs nişancı oyunları birincil ve ikincil tetikleme-sola ve sağ tıklama. Sonsuz koşucu atlamak için sol tıklamayı, kısa çizgi çekmek için sağ tıklamayı kullanın. Şunun için destek eklemedik: orta tıklama etkinliğinde oluşturmanız gerekir.
Düğmelere basma işlemlerini işlemek için ACTION_DOWN
ve ACTION_UP
öğelerini kullanın. Daha sonra
İşlemi tetikleyen düğmeyi belirlemek için getActionButton
veya
Tüm düğmelerin durumunu öğrenmek için getButtonState
tuşlarına basın.
Bu örnekte, sonucun görüntülenmesine yardımcı olmak için bir numaralandırma kullanılmıştır
getActionButton
:
Kotlin
enum class MouseButton { LEFT, RIGHT, UNKNOWN; companion object { fun fromMotionEvent(motionEvent: MotionEvent): MouseButton { return when (motionEvent.actionButton) { MotionEvent.BUTTON_PRIMARY -> LEFT MotionEvent.BUTTON_SECONDARY -> RIGHT else -> UNKNOWN } } } }
Java
enum MouseButton { LEFT, RIGHT, MIDDLE, UNKNOWN; static MouseButton fromMotionEvent(MotionEvent motionEvent) { switch (motionEvent.getActionButton()) { case MotionEvent.BUTTON_PRIMARY: return MouseButton.LEFT; case MotionEvent.BUTTON_SECONDARY: return MouseButton.RIGHT; default: return MouseButton.UNKNOWN; } } }
Bu örnekte, işlem, fareyle üzerine gelme etkinliklerine benzer şekilde gerçekleştirilir:
Kotlin
// Handle the generic motion event gameView.setOnGenericMotionListener { _, motionEvent -> var handled = false if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { when (motionEvent.action) { MotionEvent.ACTION_BUTTON_PRESS -> Log.d( "MA", "${MouseButton.fromMotionEvent(motionEvent)} pressed at ${motionEvent.x}, ${motionEvent.y}" ) MotionEvent.ACTION_BUTTON_RELEASE -> Log.d( "MA", "${MouseButton.fromMotionEvent(motionEvent)} released at ${motionEvent.x}, ${motionEvent.y}" ) } handled = true } handled }
Java
gameView.setOnGenericMotionListener((view, motionEvent) -> { if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_BUTTON_PRESS: Log.d("MA", MouseButton.fromMotionEvent(motionEvent) + " pressed at " + motionEvent.getX() + ", " + motionEvent.getY()); break; case MotionEvent.ACTION_BUTTON_RELEASE: Log.d("MA", MouseButton.fromMotionEvent(motionEvent) + " released at " + motionEvent.getX() + ", " + motionEvent.getY()); break; } return true; } return false; });
Fare tekerleğini kaydırmayı tutma
Yakınlaştırmak için iki parmak ucunuzu yakınlaştırmak yerine farenin kaydırma tekerleğini kullanmanızı öneririz hareketler yapabilir veya oyununuzdaki kaydırma alanlarına dokunup sürükleyebilirsiniz.
Kaydırma tekerleği değerlerini okumak için ACTION_SCROLL
etkinliğini dinleyin. Delta
son kare AXIS_VSCROLL
ile getAxisValue
kullanılarak alınabildiğinden
dikey ofset için AXIS_HSCROLL
ve yatay uzaklık için AXIS_HSCROLL
. Örnek:
Kotlin
gameView.setOnGenericMotionListener { _, motionEvent -> var handled = false if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { when (motionEvent.action) { MotionEvent.ACTION_SCROLL -> { val scrollX = motionEvent.getAxisValue(MotionEvent.AXIS_HSCROLL) val scrollY = motionEvent.getAxisValue(MotionEvent.AXIS_VSCROLL) Log.d("MA", "Mouse scrolled $scrollX, $scrollY") } } handled = true } handled }
Java
gameView.setOnGenericMotionListener((view, motionEvent) -> { if (motionEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_SCROLL: float scrollX = motionEvent.getAxisValue(MotionEvent.AXIS_HSCROLL); float scrollY = motionEvent.getAxisValue(MotionEvent.AXIS_VSCROLL); Log.d("MA", "Mouse scrolled " + scrollX + ", " + scrollY); break; } return true; } return false; });
Fare girişini yakala
Bazı oyunların (ör. birinci veya üçüncü oyun) fare imlecinin tam kontrolünü ele alması gerekir
fare hareketini kamera hareketleriyle eşleştiren kişi aksiyon oyunları. Şu atılacak:
özel olarak farenin kontrolü, View.requestPointerCapture()
yöntemini çağırır.
requestPointerCapture()
yalnızca
bir görünümü vardır. Bu nedenle,
onCreate
geri arama. Oyuncu etkileşiminin yakalanmasını beklemeniz gerekir.
Örneğin, ana menüyle etkileşimde bulunurken fare işaretçisini veya
onWindowFocusChanged
geri arama. Örnek:
Kotlin
override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (hasFocus) { gameView.requestPointerCapture() } }
Java
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { View gameView = findViewById(R.id.game_view); gameView.requestPointerCapture(); } }
requestPointerCapture()
tarafından yakalanan etkinlikler
odaklanılabilir görünüme "kaydedilebilir" olarak
OnCapturedPointerListener
. Örnek:
Kotlin
gameView.focusable = View.FOCUSABLE gameView.setOnCapturedPointerListener { _, motionEvent -> Log.d("MA", "${motionEvent.x}, ${motionEvent.y}, ${motionEvent.actionButton}") true }
Java
gameView.setFocusable(true); gameView.setOnCapturedPointerListener((view, motionEvent) -> { Log.d("MA", motionEvent.getX() + ", " + motionEvent.getY() + ", " + motionEvent.getActionButton()); return true; });
Özel fare yakalama olanağı sunmak, örneğin oyuncuların
bir duraklatma menüsüyle etkileşim kurma, View.releasePointerCapture()
yöntemini çağırma.