Supporto input

Anche se molti dispositivi ChromeOS hanno touch screen, per i giochi la migliore esperienza di interazione su questi dispositivi con schermi grandi viene spesso offerta tramite mouse, tastiera e gamepad. Il mondo dei giochi mobile è spesso incentrato sul tocco e bisogna riflettere su come fornire la migliore esperienza agli utenti che non utilizzano il tocco.

Inizia consultando le best practice per l'aggiunta del supporto di tastiera, mouse e controller di gioco. Presta particolare attenzione al caso in cui gli utenti tengono premuti i tasti o ne premono più di uno.

Le azioni basate sul tocco vanno bene per i Chromebook con touchscreen, ma è importante includere anche controlli fisici ben studiati per un'esperienza ottimale. Ad esempio, l'input del mouse è ideale per regolare la visualizzazione o la mira, ma non deve essere necessario per eseguire azioni. Se un gioco mobile ha un menu sullo schermo che consente a un utente di usare una torcia, una spada o uno scudo premendo un pulsante con il pollice, richiedere di fare clic su questi pulsanti con un mouse offrirà un'esperienza scadente. I tasti della tastiera devono invece essere designati per attivare ogni azione sostituendo onKeyUp o onKeyDown. Per dettagli e codice, consulta la pagina sulla compatibilità degli input.

Acquisizione del mouse

I giochi in prima persona hanno un aspetto migliore sul computer quando implementano l'acquisizione del mouse. In questo modo il puntatore del mouse viene nascosto e l'utente può spostare il punto di vista, mirare, sterzare e così via usando il mouse. Di seguito è riportata una demo di base dell'acquisizione del mouse che registra la posizione del puntatore e gli stati dei pulsanti dopo che l'utente fa clic su una visualizzazione di testo denominata text_clickme. Per saperne di più, consulta la documentazione sulla cattura del puntatore di Android.

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

Chat

Le funzionalità di chat possono essere un componente importante dei giochi multigiocatore. Prenditi un po' di tempo per pensare a come gli utenti interagiranno con la funzionalità di chat del tuo gioco mentre giocano. In particolare, se sta giocando con la tastiera, non dovrebbe dover usare il mouse o il touchscreen per accedere alla chat o inviare messaggi.

Un pattern potrebbe essere quello di avere un tasto della tastiera che mette a fuoco la casella della chat e gestisce il tasto Invio per inviare i messaggi.

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

Consulta la documentazione sulla tastiera nella pagina Compatibilità input di Android.

Supporto per stilo

Le app di disegno e i giochi basati sullo scorrimento possono sfruttare l'input della stilo sui dispositivi ChromeOS. Per ulteriori dettagli, consulta la pagina Input con stilo.

Controller di gioco

I Chromebook supportano fino a quattro controller di gioco. Gli sviluppatori devono utilizzare le API Game Controller standard di Android per supportarli.

I pulsanti sono mappati a valori comuni seguendo una mappatura comune. Purtroppo, non tutti i produttori di controller di gioco seguono le stesse convenzioni di mappatura. Consentire agli utenti di scegliere tra diverse mappature dei controller più comuni può migliorare notevolmente l'esperienza.