סקירה כללית

בקרי המשחקים כוללים תכונות נוספות שמשמעותן מגבירים את האינטראקציה של השחקנים ואת חוויית המשחק. המשוב הפיזי, חיישני התנועה והאור לבקרי משחקים ב-Android יש תפקיד חשוב במיוחד עומק והעשרה של חוויית הגיימינג. כל תכונה מעוררת באופן ייחודי החושים של השחקן, וכך מעודדים אינטראקציות משמעותיות ואינטואיטיביות יותר את המשחק.

מגע

תכונת המשוב הפיזי בבקרי משחקים של Android היא טכנולוגיה חיונית שמספק משוב מגע מציאותי במהלך הגיימפליי.

טכנולוגיית הה {0/}ה מבוססת על רטט פיזי למשתמש או תנועות. לדוגמה, כשמתרחש פיצוץ במשחק, השלט רחוק רוטט ומאפשר לשחקן לחוש את ההשפעה באופן מציאותי. בנוסף, רטט עדין יכול להיות מסונכרן עם צליל של דמות הולכת ולספק חוויה מציאותית יותר. סוג זה של משוב פיזי שמאפשר לשחקנים לחוש פיזית אירועים שונים שמתרחשים בתוך המשחק.

הטכנולוגיה הזו מאפשרת לשחקנים להתעמק בהם, וכך מגבירה את התשובות הרגשיות, מעשיר את הדינמיקה של המשחק. הגדרות המשוב הפיזי בבקרים של המשחקים ל-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 ו- מניפסט של אפליקציה.

חיישני תנועה

אחת מהטכנולוגיות החדשניות ביותר שמשפרות את מהלך המשחק (gameplay) היא בקר משחקים ל-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 ו- מניפסט של אפליקציה.

לוח מגע לשלט

בקרי משחקים מסוימים כוללים לוח מגע שאפשר להשתמש בו למגוון פעולות בתוך המשחק, כמו ניווט בתפריטים או שליטה בדמויות במשחק בדרך אינטואיטיבית יותר.

לוח מגע בבקר המשחקים.
איור 1. לוח מגע בבקר המשחקים.

בקרי משחקים עם לוחות מגע משולבים מאפשרים להפעיל שליטה ישירה במכשיר Android. נגיעה בלוח המגע יוצרת מצביע עכבר על המסך, ומאפשרת לניווט אינטואיטיבי בסגנון עכבר.