Panoramica

I controller di gioco offrono funzionalità aggiuntive che migliorano notevolmente l'interazione e l'immersività dei giocatori. La tecnologia aptica, i sensori di movimento e le funzionalità di luce dei controller di gioco Android sono particolarmente fondamentali per approfondire e arricchire l'esperienza di gioco. Ogni funzionalità stimola in modo univoco i sensi del giocatore, promuovendo interazioni più significative e intuitive all'interno del gioco.

Tecnologia aptica

La funzionalità aptica dei controller di gioco Android è una tecnologia fondamentale che fornisce feedback tattili realistici durante il gameplay.

La tecnologia aptica invia all'utente sensazioni fisiche attraverso vibrazioni o movimenti. Ad esempio, quando si verifica un'esplosione nel gioco, il controller vibra, consentendo al giocatore di percepire l'impatto in modo realistico. Inoltre, le vibrazioni sottili possono essere sincronizzate con il suono di un personaggio che cammina o corri, offrendo un'esperienza più realistica. Questo tipo di feedback aptico consente ai giocatori di percepire fisicamente i vari eventi che si verificano nel gioco.

Questa tecnologia massimizza l'immersività dei giocatori, amplifica le risposte emotive e arricchisce le dinamiche del gioco. Le impostazioni aptica dei controller di gioco per Android non solo ampliano le possibilità creative per gli sviluppatori di giochi, ma offrono anche ai giocatori un'esperienza di gioco più realistica che mai.

fun triggerVibrationMultiChannel(
  deviceId: Int, leftIntensity: Int, leftDuration: Int,
  rightIntensity: Int, rightDuration: Int) {
  val inputDevice = InputDevice.getDevice(deviceId)
  val vibratorManager = inputDevice!!.vibratorManager
  if (vibratorManager != null) {
    val vibratorIds = vibratorManager.vibratorIds
    val vibratorCount = vibratorIds.size
    if (vibratorCount > 0) {
      // We have an assumption that game controllers have two vibrators
      // corresponding to a left motor and a right motor, and the left
      // motor will be first.
      updateVibrator(vibratorManager.getVibrator(vibratorIds[0]), leftIntensity, leftDuration)
      if (vibratorCount > 1) {
        updateVibrator(vibratorManager.getVibrator(vibratorIds[1]), rightIntensity, rightDuration)
      }
    }
  }
}

fun updateVibrator(vibrator: Vibrator?, intensity: Int, duration: Int) {
  if (vibrator != null) {
    if (intensity == 0) {
      vibrator.cancel()
    } else if (duration > 0) {
      vibrator.vibrate(VibrationEffect.createOneShot(duration.toLong(), intensity))
    }
  }
}

Per usare la vibrazione, imposta una funzionalità e un'autorizzazione.

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.VIBRATE"/>
  ...
</application>

Per maggiori informazioni su VibratorManager e manifest dell'app.

Sensori di movimento

Una delle tecnologie più innovative che migliorano le esperienze di gameplay è il controller di gioco Android dotato di sensore di movimento. Questa tecnologia rileva con precisione i movimenti fisici degli utenti e traduce i dati in azioni all'interno del gioco, offrendo un'esperienza di gioco più intuitiva e immersiva. In questa introduzione vedremo come funzionano le funzionalità dei sensori di movimento nei controller di gioco Android.

In genere, i sensori di movimento incorporano giroscopi e accelerometri per rilevare i movimenti e gli orientamenti degli utenti.

Deve implementare classi di listener di accelerazione e giroscopio e registrare questi listener con il gestore dei sensori del controller.

fun setIntegratedAccelerometerActive(deviceId: Int) {
  val device = InputDevice.getDevice(deviceId)
  val sensorManager = device?.sensorManager
  val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
  if (accelerometer != null) {
    val accelerometerListener =
      GameControllerAccelerometerListener(accelerometer)
    sensorManager.registerListener(
      accelerometerListener, accelerometer,
      SensorManager.SENSOR_DELAY_GAME
    )
  }
}

fun setIntegratedGyroscopeActive(deviceId: Int) {
  val device = InputDevice.getDevice(deviceId)
  val sensorManager = device?.sensorManager
  val gyroscope = sensorManager?.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
  if (gyroscope != null) {
    val gyroscopeListener = GameControllerGyroscopeListener(gyroscope)
    sensorManager.registerListener(
      gyroscopeListener, gyroscope,
      SensorManager.SENSOR_DELAY_GAME
    )
  }
}

class GameControllerAccelerometerListener(private val listenerAccelerometer: Sensor?) :
  SensorEventListener {
  override fun onSensorChanged(event: SensorEvent) {
    if (listenerAccelerometer != null) {
      synchronized(listenerAccelerometer) {
        if (event.sensor == listenerAccelerometer) {
          Log.d("Accelerometer",
            "onSensorChanged " + event.values[0] + ", "
            + event.values[1] + ", " + event.values[2])
        }
      }
    }
  }

  override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
  }
}

class GameControllerGyroscopeListener(private val listenerGyroscope: Sensor?) :
  SensorEventListener {
  override fun onSensorChanged(event: SensorEvent) {
    if (listenerGyroscope != null) {
      synchronized(listenerGyroscope) {
        if (event.sensor == listenerGyroscope) {
          Log.d("Gyroscope",
            "onSensorChanged " + event.values[0] + ", " +
            event.values[1] + ", " + event.values[2])
        }
      }
    }
  }

  override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
  }
}

Per ulteriori informazioni sui sensori di movimento e su SensorEventListener.

Luci

Le impostazioni del colore della luce sui controller di gioco per Android aggiungono una nuova dimensione di immersione nel gameplay attraverso elementi visivi.

La funzionalità del colore della luce utilizza luci LED integrate nel controller per mostrare vari colori, che rispondono in modo dinamico a diversi scenari di gioco. Ad esempio, le spie potrebbero lampeggiare in rosso quando la salute del giocatore è critica o lampeggiare in verde al termine di una missione specifica, fornendo un feedback visivo basato sugli eventi in-game. Queste impostazioni di colore chiaro aumentano il coinvolgimento degli utenti, aumentano la suspense e il divertimento con il gioco e aiutano i giocatori a immergersi più a fondo nel mondo di gioco.

Le caratteristiche di colore della luce nei controller di gioco Android hanno più che un semplice scopo decorativo: gioca un ruolo importante nell'impostare l'atmosfera del gioco e migliorare l'esperienza utente.

fun changeControllerLightColor(deviceId: Int, color: Int) {
  val device = InputDevice.getDevice(deviceId)
  device?.let {
    if (it.sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK) {
      val lightsManager = device.lightsManager
      lightsManager?.let { manager ->
        manager.lights.forEach { light ->
          val stateBuilder = LightState.Builder()
          stateBuilder.setColor(color)
          val requestBuilder = LightsRequest.Builder()
          requestBuilder.addLight(light, stateBuilder.build())
          val lightsSession = lightsManager.openSession()
          lightsSession.requestLights(requestBuilder.build())
        }
      }
    }
  }
}

Per usare la vibrazione, imposta una funzionalità e un'autorizzazione.

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.LIGHTS" />
  ...
</application>

Per maggiori informazioni su LightsManager e manifest dell'app.

Touchpad del controller

Alcuni controller di gioco includono un touchpad che può essere utilizzato per diverse azioni in-game, ad esempio navigare nei menu o controllare i personaggi del gioco in modo più intuitivo.

Touchpad sul controller di gioco.
Figura 1. Touchpad sul controller di gioco.

I controller di gioco con touchpad integrati offrono un controllo diretto dei dispositivi su Android. Quando si tocca il touchpad viene generato un puntatore del mouse sullo schermo, che consente una navigazione intuitiva come il mouse.