Visão geral

Os controles de jogos têm outros recursos que melhoram significativamente a interação e a imersão do jogador. O retorno tátil, os sensores de movimento e os recursos de luz dos controles de jogos Android são particularmente fundamentais para aprofundar e enriquecer a experiência de jogo. Cada recurso estimula os sentidos do jogador de maneira única, promovendo interações mais significativas e intuitivas dentro do jogo.

Retorno tátil

O recurso de retorno tátil nos controles de jogos Android é uma tecnologia crucial que oferece feedback tátil realista durante a jogabilidade.

A tecnologia tátil transmite sensações físicas ao usuário por meio de vibrações ou movimentos. Por exemplo, quando ocorre uma explosão no jogo, o controle vibra, permitindo que o jogador sinta o impacto de maneira realista. Além disso, vibrações sutis podem ser sincronizadas com o som de um personagem andando ou correndo, oferecendo uma experiência mais realista. Esse tipo de retorno tátil permite que os jogadores sintam fisicamente vários eventos acontecendo no jogo.

Essa tecnologia maximiza a imersão do jogador, amplifica as respostas emocionais e enriquece a dinâmica do jogo. As configurações de retorno tátil nos controles de jogos Android não só ampliam as possibilidades criativas para os desenvolvedores de jogos, como também fornecem aos jogadores uma experiência mais realista do que nunca.

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

Para usar a vibração, ele define um recurso e uma permissão.

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

Para mais informações sobre VibratorManager e o manifesto do app.

Sensores de movimento

Uma das tecnologias mais inovadoras que melhoram as experiências de jogabilidade é o controle de jogo Android com sensor de movimento. Essa tecnologia detecta com precisão os movimentos físicos dos usuários e converte esses dados em ações no jogo, proporcionando uma experiência mais intuitiva e imersiva. Nesta introdução, vamos ver como funcionam os recursos do sensor de movimento nos controles de jogos Android.

Os sensores de movimento normalmente incorporam giroscópios e acelerômetros para detectar os movimentos e as orientações dos usuários.

Ela precisa implementar classes de listener de aceleração e giroscópio e registrar esses listeners com o gerenciador de sensores do controle.

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

Para mais informações sobre sensores de movimento e SensorEventListener.

Luzes

As configurações de cor da luz nos controles de jogos Android adicionam uma nova dimensão de imersção à jogabilidade pelos elementos visuais.

O recurso de cor clara usa luzes de LED integradas no controle para exibir várias cores, que respondem dinamicamente a diferentes cenários de jogos. Por exemplo, as luzes podem piscar em vermelho quando a saúde do jogador for importante ou brilhar verde após a conclusão de uma missão específica, oferecendo feedback visual com base nos eventos no jogo. Essas configurações de cores claras aprofundam o engajamento do usuário, aumentam o suspense e a diversão do jogo e ajudam os jogadores a mergulhar mais no mundo do jogo.

Os recursos de cor clara nos controles de jogos Android têm mais do que uma mera finalidade decorativa: eles desempenham um papel significativo na definição do clima do jogo e na melhoria da experiência do usuário.

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

Para usar a vibração, ele define um recurso e uma permissão.

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

Para mais informações sobre LightsManager e o manifesto do app.

Touchpad do controle

Alguns controles de jogos incluem um touchpad que pode ser usado para várias ações, como navegar em menus ou controlar personagens de um jogo mais intuitivo.

Touchpad no controle de jogo.
Figura 1. Touchpad no controle de jogo.

Os controles de jogos com touchpads integrados oferecem controle direto do dispositivo no Android. Tocar no touchpad gera um ponteiro de mouse na tela, permitindo uma navegação intuitiva semelhante ao mouse.