Mauseingabe

In diesem Thema wird die Mauseingabe für Google Play Spiele auf dem PC für Spiele, bei denen der Eingabeübersetzungsmodus kein ideales Spielererlebnis bietet.

PC-Spieler haben normalerweise eine Tastatur und eine Maus anstelle eines Touchscreens. sollten Sie sich überlegen, ob Ihr Spiel Mauseingaben unterstützt. Standardmäßig Google Play Spiele auf dem PC wandelt jeden Klick auf der linken Seite in ein einzelnes virtuelles Tippereignis. Dies wird als „Eingabeübersetzungsmodus“ bezeichnet.

Obwohl Ihr Spiel durch diesen Modus funktioniert wird, müssen Sie nur PC-Spielern ein nativ anmutendes Spielerlebnis bieten. Dafür empfehlen wir, implementieren Sie Folgendes:

  • Hover-Zustände für Kontextmenüs, anstatt Aktionen bei gedrückter Maustaste gedrückt zu halten
  • Klicke mit der rechten Maustaste, um alternative Aktionen anzuzeigen, die durch langes Drücken oder in einem Kontext erfolgen Menü
  • Mauserkennung für First- oder Third-Person-Actionspiele anstelle von Drücken und Drag-Event

Zur Unterstützung von auf PCs üblichen UI-Mustern müssen Sie die Eingabe deaktivieren Übersetzungsmodus.

Die Eingabeverarbeitung für Google Play Spiele auf dem PC ist identisch mit der von ChromeOS: Die Änderungen, die PCs unterstützen, um dein Spiel für alle Android-Spieler zu verbessern.

Eingabeübersetzungsmodus deaktivieren

Gehen Sie in der Datei AndroidManifest.xml so vor: deklarieren: android.hardware.type.pc-Funktion. Das bedeutet, dass dein Spiel PC-Hardware verwendet und die Eingabeübersetzung deaktiviert ist . Wenn du required="false" hinzufügst, kann dein Spiel auf Smartphones und Tablets ohne Maus installiert werden können. Beispiel:

<manifest ...>
  <uses-feature
      android:name="android.hardware.type.pc"
      android:required="false" />
  ...
</manifest>

Die Produktionsversion von Google Play Spiele auf dem PC wird zur richtigen Version wenn ein Spiel gestartet wird. Bei Ausführung im Entwickleremulator müssen Sie Klicken Sie mit der rechten Maustaste auf das Symbol in der Taskleiste, wählen Sie Developer Options (Entwickleroptionen) aus und klicken Sie dann PC-Modus(KiwiMouse) verwenden, um unformatierte Mauseingaben zu empfangen.

Screenshot von „PC-Modus(KiwiMouse)“ im Kontextmenü ausgewählt

Danach wird die Mausbewegung von View.onGenericMotionEvent mit der Quelle SOURCE_MOUSE erfasst. was darauf hinweist, dass es sich um ein Mausereignis handelt.

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

Weitere Informationen zur Verarbeitung der Mauseingabe finden Sie in der ChromeOS-Dokumentation

Mausbewegungen verarbeiten

Wenn Sie Mausbewegungen erkennen möchten, hören Sie sich ACTION_HOVER_ENTER, ACTION_HOVER_EXIT und ACTION_HOVER_MOVE Ereignisse.

Diese Funktion eignet sich am besten, um zu erkennen, wie Nutzende der Mauszeiger auf Schaltflächen oder Spiel, bei dem ein Hinweisfeld angezeigt oder ein Mouseover-Zustand implementiert werden kann um anzugeben, was ein Spieler auswählen wird. Beispiel:

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

Maustasten handhaben

PCs verfügen schon lange über die linke und die rechte Maustaste, wodurch interaktive Elemente primäre und sekundäre Aktionen. Tippen Sie in einem Spiel auf Aktionen wie Tippen auf ein am besten einem Linksklick zugeordnet, wo Touch- und andere Elemente Warteschleifenaktionen fühlt sich am mit der rechten Maustaste. Bei Echtzeit-Strategiespielen gibt es klicken Sie mit der linken Maustaste, um ein Element auszuwählen, und klicken Sie mit der rechten Maustaste, um es zu verschieben. Ego-Shooter weisen möglicherweise primäre und sekundäre Fire-to-Left- und Rechtsklick-Taste. Ein Endlos-Runner könnte klicken Sie mit der linken Maustaste, um zu springen, und mit der rechten Maustaste, um zu springen. Wir haben keine Unterstützung hinzugefügt für das Middle-Click-Ereignis.

Verwende für das Drücken von Tasten ACTION_DOWN und ACTION_UP. Verwenden Sie dann getActionButton, um zu ermitteln, welche Schaltfläche die Aktion ausgelöst hat, oder getButtonState, um den Status aller Schaltflächen abzurufen.

In diesem Beispiel wird ein enum-Wert verwendet, um das Ergebnis eines 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;
        }
    }
}

In diesem Beispiel wird die Aktion ähnlich wie die Hover-Ereignisse behandelt:

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

Scrollen mit dem Mausrad

Wir empfehlen, zum Zoomen das Scrollrad der Maus anstelle von Auseinander- und Zusammenziehen zu verwenden. Touch-Gesten verwenden oder Scrollbereiche berühren und ziehen.

Zum Lesen der Scrollrad-Werte warten Sie auf das ACTION_SCROLL-Ereignis. Das Delta da der letzte Frame mit getAxisValue und AXIS_VSCROLL abgerufen werden kann. für den vertikalen Versatz und AXIS_HSCROLL für den horizontalen Versatz. Beispiel:

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

Mauseingabe erfassen

Einige Spiele benötigen die volle Kontrolle über den Mauszeiger, z. B. 1. oder 3. Actionspiele für Personen, bei denen Mausbewegungen der Kamera zugeordnet werden. Zu nehmen exklusive Steuerung der Maus: View.requestPointerCapture() aufrufen.

requestPointerCapture() funktioniert nur, wenn die Ansichtshierarchie mit Ihren fokussiert ist. Aus diesem Grund können Sie keine Zeigeraufnahme in der onCreate-Callback. Sie sollten entweder warten, bis eine Spielerinteraktion erfasst wird, den Mauszeiger (z. B. beim Interagieren mit dem Hauptmenü) oder die Funktion onWindowFocusChanged Callback des Nutzers an. Beispiel:

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

Von requestPointerCapture() erfasste Ereignisse werden an die fokussierbare Ansicht weitergeleitet, OnCapturedPointerListener. Beispiel:

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

Um exklusive Mausaufnahmen zu veröffentlichen, etwa, damit Spieler Pausemenü öffnen: View.releasePointerCapture() aufrufen