概述

游戏控制器配备了额外的功能,这些功能极大地增强了玩家的互动性和沉浸感。Android 游戏控制器的触觉、运动传感器和灯光功能对于加深和丰富游戏体验尤为重要。每个功能都以独特的方式刺激玩家的感官,促进游戏中更具意义和直观的互动。

触觉

Android 游戏控制器中的触觉功能是一项关键技术,它在游戏过程中提供逼真的触觉反馈。

触觉技术通过振动或运动向用户传递物理感觉。例如,当游戏中发生爆炸时,控制器会振动,让玩家能够真实地感受到爆炸的影响。此外,可以将细微的振动与角色行走或奔跑的声音同步,从而提供更逼真的体验。这种类型的触觉反馈使玩家能够在物理上感受到游戏中发生的各种事件。

这项技术最大限度地提高了玩家的沉浸感,放大了情感反应,并丰富了游戏的动态。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 游戏控制器上的灯光颜色设置通过视觉元素为游戏体验增添了新的沉浸感维度。

灯光颜色功能利用控制器中内置的 LED 灯来显示各种颜色,这些颜色会根据不同的游戏场景动态响应。例如,当玩家的健康状况危急时,灯光可能会闪烁红色;完成特定任务时,灯光可能会发出绿色光芒,根据游戏内事件提供视觉反馈。这些灯光颜色设置加深了用户参与度,提高了游戏的悬念和乐趣,帮助玩家更深入地沉浸到游戏世界中。

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应用清单 的更多信息。

控制器触控板

一些游戏控制器包括触控板,可用于各种游戏内操作,例如导航菜单或以更直观的方式控制游戏角色。

Touchpad on the game controller.
图 1. 游戏控制器上的触控板。

带有集成触控板的游戏控制器在 Android 上提供直接的设备控制。触摸触控板会生成屏幕上的鼠标指针,允许进行直观的类似鼠标的导航。