بررسی اجمالی

کنترلرهای بازی به ویژگی های اضافی مجهز هستند که تعامل و غوطه وری بازیکنان را به طور قابل توجهی افزایش می دهد. لمسی، حسگرهای حرکتی و عملکردهای نوری کنترلرهای بازی اندروید به ویژه در تعمیق و غنی‌تر کردن تجربه بازی بسیار موثر هستند. هر ویژگی به طور منحصر به فردی حواس بازیکن را تحریک می کند و تعاملات معنادار و شهودی بیشتری را در بازی ایجاد می کند.

هپتیک ها

ویژگی لمسی در کنترلرهای بازی اندروید یک فناوری حیاتی است که بازخورد لمسی واقعی را در طول بازی ارائه می دهد.

فناوری Haptics احساسات فیزیکی را از طریق ارتعاشات یا حرکات به کاربر منتقل می کند. به عنوان مثال، هنگامی که یک انفجار در بازی رخ می دهد، کنترلر به لرزه در می آید و به بازیکن اجازه می دهد تا ضربه را به طور واقعی احساس کند. علاوه بر این، ارتعاشات ظریف را می توان با صدای راه رفتن یا دویدن یک شخصیت هماهنگ کرد و تجربه واقعی تری را ارائه داد. این نوع بازخورد لمسی بازیکنان را قادر می‌سازد تا رویدادهای مختلفی را که در بازی اتفاق می‌افتد، به صورت فیزیکی احساس کنند.

این فناوری غوطه ور شدن بازیکن را به حداکثر می رساند، پاسخ های احساسی را تقویت می کند و پویایی بازی را غنی می کند. تنظیمات Haptics در کنترلرهای بازی اندروید نه تنها امکانات خلاقانه را برای توسعه دهندگان بازی گسترش می دهد، بلکه تجربه بازی واقعی تر از همیشه را برای بازیکنان فراهم می کند.

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 و App manifest .

سنسورهای حرکت

یکی از نوآورانه‌ترین فناوری‌هایی که تجربه گیم‌پلی را افزایش می‌دهد، کنترلر بازی اندروید مجهز به حسگر حرکتی است. این فناوری دقیقاً حرکات فیزیکی کاربران را تشخیص می‌دهد و آن داده‌ها را به اقدامات درون بازی تبدیل می‌کند و تجربه بازی بصری‌تر و همه‌جانبه‌تری را ارائه می‌دهد. در این مقدمه، نحوه عملکرد سنسور حرکت در کنترلرهای بازی اندروید را بررسی خواهیم کرد.

سنسورهای حرکتی معمولاً از ژیروسکوپ و شتاب سنج برای تشخیص حرکات و جهت گیری کاربران استفاده می کنند.

نیاز به پیاده سازی کلاس های شتاب دهنده شتاب و ژیروسکوپ دارد و این شنوندگان را با مدیر حسگر کنترلر ثبت می کند.

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 .

چراغ ها

تنظیمات رنگ روشن در کنترلرهای بازی اندروید بعد جدیدی از غوطه وری را به گیم پلی از طریق عناصر بصری اضافه می کند.

ویژگی رنگ نور از چراغ های LED داخلی در کنترل برای نمایش رنگ های مختلف استفاده می کند که به صورت پویا به سناریوهای مختلف بازی پاسخ می دهد. به عنوان مثال، ممکن است وقتی وضعیت سلامتی بازیکن بحرانی است، چراغ‌ها به رنگ قرمز چشمک بزنند یا پس از اتمام یک مأموریت خاص، به رنگ سبز درآیند و بازخورد بصری را بر اساس رویدادهای درون بازی ارائه دهند. این تنظیمات رنگ روشن، تعامل کاربر را عمیق تر می کند، تعلیق و لذت بازی را افزایش می دهد و به بازیکنان کمک می کند تا به طور کامل در دنیای بازی غوطه ور شوند.

ویژگی‌های رنگ روشن در کنترلرهای بازی اندروید بیش از یک هدف تزئینی صرف عمل می‌کند - نقش مهمی در تنظیم حال و هوای بازی و بهبود تجربه کاربر دارد.

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 و App manifest .

پد لمسی کنترلر

برخی از کنترل‌کننده‌های بازی دارای یک پد لمسی هستند که می‌تواند برای انواع اعمال درون بازی، مانند پیمایش منوها یا کنترل شخصیت‌های بازی به روشی بصری‌تر، استفاده شود.

پد لمسی روی کنترلر بازی.
شکل 1. پد لمسی روی کنترلر بازی.

کنترلرهای بازی با پد لمسی یکپارچه، کنترل مستقیم دستگاه را در اندروید ارائه می دهند. لمس پد لمسی نشانگر ماوس روی صفحه را ایجاد می کند که امکان ناوبری بصری شبیه به ماوس را فراهم می کند.