نظرة عامة

تكون وحدات التحكم في الألعاب مجهزة بميزات إضافية تعزز بشكل كبير تفاعل اللاعبين واندماجهم في اللعب. وتساهم ميزات اللمس وأجهزة استشعار الحركة والإضاءة في وحدات التحكم في الألعاب في 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.

تتضمن أجهزة استشعار الحركة عادةً الجيروسكوب ومقاييس التسارع لرصد حركات المستخدمين واتجاهاتهم.

وهي تحتاج إلى تطبيق فئات التسريع ومستمع الجيروسكوب وتسجيل هذه المستمعين لدى مدير أداة الاستشعار في وحدة التحكم.

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 وبيان التطبيق.

لوحة اللمس الخاصة بوحدة التحكّم

تتضمّن بعض وحدات التحكّم في الألعاب لوحة لمس يمكن استخدامها لتنفيذ مجموعة متنوّعة من الإجراءات داخل اللعبة، مثل التنقّل بين القوائم أو التحكّم في شخصيات اللعبة بطريقة أكثر سهولة.

لوحة اللمس على وحدة التحكّم في الألعاب
الشكل 1. لوحة اللمس على وحدة التحكّم في الألعاب

توفر وحدات التحكم في الألعاب المزودة بلوحات اللمس المدمَجة إمكانية التحكم المباشر في الجهاز على نظام التشغيل Android. يؤدي لمس لوحة اللمس إلى إنشاء مؤشر ماوس على الشاشة، مما يتيح إمكانية التنقل السهل الشبيه بالماوس.