Обзор

Игровые контроллеры оснащены дополнительными функциями, которые значительно улучшают взаимодействие и погружение игрока. Тактильные ощущения, датчики движения и световые функции игровых контроллеров Android особенно важны для углубления и обогащения игрового процесса. Каждая функция уникальным образом стимулирует чувства игрока, способствуя более значимому и интуитивному взаимодействию в игре.

Гаптика

Функция тактильной связи в игровых контроллерах Android — это важнейшая технология, обеспечивающая реалистичную тактильную обратную связь во время игры.

Технология Haptics передает пользователю физические ощущения посредством вибраций или движений. Например, когда в игре происходит взрыв, контроллер вибрирует, позволяя игроку реалистично ощутить удар. Кроме того, тонкие вибрации можно синхронизировать со звуком ходьбы или бега персонажа, что делает игру более реалистичной. Этот тип тактильной обратной связи позволяет игрокам физически чувствовать различные события, происходящие в игре.

Эта технология максимизирует погружение игрока, усиливает эмоциональные реакции и обогащает динамику игры. Настройки Haptics в игровых контроллерах Android не только расширяют творческие возможности разработчиков игр, но и предоставляют игрокам более реалистичный игровой процесс, чем когда-либо прежде.

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

Чтобы использовать вибрацию, он устанавливает функцию и разрешение.

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

Дополнительные сведения о VibratorManager и манифесте приложения см.

Датчики движения

Одной из самых инновационных технологий, улучшающих игровой процесс, является игровой контроллер Android, оснащенный датчиком движения. Эта технология точно определяет физические движения пользователей и преобразует эти данные в действия внутри игры, обеспечивая более интуитивно понятный и захватывающий игровой процесс. В этом введении мы рассмотрим, как работают функции датчика движения в игровых контроллерах Android.

Датчики движения обычно включают в себя гироскопы и акселерометры для определения движений и ориентации пользователей.

Ему необходимо реализовать классы прослушивателей ускорения и гироскопа и зарегистрировать эти прослушиватели в диспетчере датчиков контроллера.

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

Для получения дополнительной информации о датчиках движения и SensorEventListener .

Свет

Настройки цвета подсветки на игровых контроллерах Android добавляют новое измерение погружения в игровой процесс с помощью визуальных элементов.

Функция цвета подсветки использует встроенные в контроллер светодиоды для отображения различных цветов, которые динамически реагируют на различные игровые сценарии. Например, индикаторы могут мигать красным, когда здоровье игрока критическое, или светиться зеленым после завершения определенной миссии, обеспечивая визуальную обратную связь на основе внутриигровых событий. Эти настройки светлого цвета углубляют взаимодействие с пользователем, усиливают напряжение и удовольствие от игры, а также помогают игрокам более полно погрузиться в игровой мир.

Функции светлого цвета в игровых контроллерах Android служат не просто декоративной цели — они играют важную роль в создании настроения в игре и улучшении пользовательского опыта.

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

Чтобы использовать вибрацию, он устанавливает функцию и разрешение.

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

Дополнительные сведения о LightsManager и манифесте приложения см.

Тачпад контроллера

Некоторые игровые контроллеры оснащены сенсорной панелью, которую можно использовать для различных внутриигровых действий, таких как навигация по меню или более интуитивно понятное управление игровыми персонажами.

Тачпад на игровом контроллере.
Рис. 1. Тачпад на игровом контроллере.

Игровые контроллеры со встроенными сенсорными панелями обеспечивают прямое управление устройствами на Android. Прикосновение к сенсорной панели создает указатель мыши на экране, обеспечивая интуитивно понятную навигацию, аналогичную мыши.