Fare girişi

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).

&quot;PC mode(KiwiMouse)&quot; ekran görüntüsü içerik menüsünde seçili

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.