نظرة عامة

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

الأضواء

تضيف إعدادات اللون الفاتح على أذرع التحكّم في الألعاب بعدًا جديدًا الاندماج في أسلوب اللعب من خلال العناصر المرئية

تستخدم ميزة لون الإضاءة مصابيح 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 ويؤدي لمس لوحة اللمس إلى إنشاء مؤشر ماوس على الشاشة، ما يسمح للتنقل بسهولة مثل الماوس.