Pomoc we wprowadzaniu danych

Wiele urządzeń z ChromeOS ma ekrany dotykowe, ale w przypadku gier najlepsze wrażenia na tych urządzeniach z dużym ekranem zapewnia często mysz, klawiatura i gamepad. Świat gier mobilnych jest często oparty na dotyku, dlatego warto zastanowić się, jak zapewnić jak najlepsze wrażenia użytkownikom, którzy nie korzystają z tej funkcji.

Zacznij od zapoznania się ze sprawdzonymi metodami dodawania obsługi klawiatury, myszy i kontrolerów do gier. Zwróć szczególną uwagę na sytuacje, w których użytkownicy przytrzymują klawisze lub naciskają kilka klawiszy naraz.

Działania oparte na dotyku są odpowiednie w przypadku Chromebooków z ekranem dotykowym, ale ważne jest, aby zapewnić też przemyślane sterowanie fizyczne, które zapewni komfort użytkowania. Na przykład mysz świetnie sprawdza się do dostosowywania widoku lub celowania, ale nie powinna być wymagana do wykonywania działań. Jeśli w grze mobilnej jest menu ekranowe, które umożliwia użytkownikowi używanie latarki, miecza lub tarczy przez naciśnięcie kciukiem przycisku, wymaganie od niego klikania tych przycisków myszą będzie powodować słabe wrażenia. Zamiast tego klawisze klawiatury powinny być przypisane do wywoływania poszczególnych działań przez zastąpienie onKeyUp lub onKeyDown. Szczegółowe informacje i kod znajdziesz na stronie zgodności danych wejściowych.

Przechwytywanie myszy

Gry z perspektywy pierwszej osoby najlepiej wyglądają na komputerze, gdy mają włączone przechwytywanie myszy. Spowoduje to ukrycie wskaźnika myszy i umożliwi użytkownikowi przesuwanie punktu widzenia, celowanie, sterowanie itp. za pomocą myszy. Poniżej znajduje się podstawowa wersja demonstracyjna przechwytywania myszy, która rejestruje położenie wskaźnika i stan przycisków po kliknięciu przez użytkownika widoku tekstu o nazwie text_clickme. Więcej informacji znajdziesz w dokumentacji dotyczącej przechwytywania wskaźnika na Androidzie.

class MainActivity : AppCompatActivity() {
    var mouse_x: Float = 0f
    var mouse_y: Float = 0f
    var mouse_left_pressed = false
    var mouse_center_pressed = false
    var mouse_right_pressed = false
    var mouse_scrolling = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        text_clickme.setOnClickListener {
            text_clickme.requestPointerCapture()
        }

        text_clickme.setOnCapturedPointerListener { view, motionEvent ->
            // Get the coordinates required by your app
            mouse_x = motionEvent.x
            mouse_y = motionEvent.y

            when (motionEvent.action) {
                ACTION_DOWN -> {
                    when (motionEvent.buttonState) {
                        BUTTON_PRIMARY -> mouse_left_pressed = true
                        BUTTON_SECONDARY -> mouse_right_pressed = true
                        BUTTON_TERTIARY -> mouse_center_pressed = true
                    }
                    mouse_scrolling = false
                }

                ACTION_CANCEL,
                ACTION_UP -> {
                    when (motionEvent.actionButton) {
                        BUTTON_PRIMARY -> mouse_left_pressed = false
                        BUTTON_SECONDARY -> mouse_right_pressed = false
                        BUTTON_TERTIARY -> mouse_center_pressed = false
                        0 -> {
                            mouse_left_pressed = false
                            mouse_right_pressed = false
                            mouse_center_pressed = false
                        }
                    }
                    mouse_scrolling = false
                }
                ACTION_SCROLL -> {
                    mouse_scrolling = true
                }
                else -> {
                    mouse_scrolling = false
                }
            }

            // Indicate event was consumed
            true
        }
    }

    // Release pointer capture when escape pressed
    override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KEYCODE_ESCAPE) {
            text_clickme.releasePointerCapture()
            return true;
        }
        return super.onKeyUp(keyCode, event)
    }
}

Czat

Funkcje czatu mogą być ważnym elementem gier wieloosobowych. Zastanów się, jak użytkownicy będą korzystać z funkcji czatu w Twojej grze. W szczególności, jeśli grają na klawiaturze, nie powinni używać myszy ani ekranu dotykowego, aby uzyskać dostęp do czatu lub wysyłać wiadomości.

Jednym ze wzorców może być przypisanie klawisza klawiatury do zaznaczania pola czatu i obsługi klawisza Enter do wysyłania wiadomości.

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_C -> {
      edittext_chatbox.requestFocus()
      true
    }
    KeyEvent.KEYCODE_ENTER -> {
      submitChatMessage()
      true
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

Zapoznaj się z dokumentacją klawiatury na stronie dotyczącej zgodności danych wejściowych na Androidzie.

Obsługa rysika

Aplikacje do rysowania i gry oparte na przesuwaniu mogą korzystać z wpisywania za pomocą rysika na urządzeniach z ChromeOS. Więcej informacji znajdziesz na stronie wprowadzania danych za pomocą rysika.

kontrolery do gier;

Chromebooki obsługują maksymalnie 4 kontrolery do gier. Deweloperzy powinni korzystać ze standardowych interfejsów API kontrolera do gier na Androida, aby obsługiwać te urządzenia.

Przyciski są mapowane na typowe wartości zgodnie z mapowaniem ogólnym. Niestety nie wszyscy producenci kontrolerów do gier stosują te same konwencje mapowania. Umożliwienie użytkownikom wyboru spośród różnych popularnych mapowań kontrolera może znacznie poprawić komfort korzystania z aplikacji.