Genel bakış

Oyun kumandaları, oyuncu etkileşimini ve oyuna daha fazla kapılma hissini önemli ölçüde geliştiren ek özelliklere sahiptir. Android oyun kumandalarının dokunma teknolojisi, hareket sensörleri ve ışık işlevleri, oyun deneyimini derinleştirmede ve zenginleştirmede özellikle etkilidir. Her özellik, oyuncunun duyularını benzersiz bir şekilde uyararak oyun içinde daha anlamlı ve sezgisel etkileşimler kurulmasını sağlar.

Dokunma teknolojisi

Android oyun kumandalarındaki dokunma teknolojisi özelliği, oyun sırasında gerçekçi dokunsal geri bildirim sağlayan çok önemli bir teknolojidir.

Dokunma teknolojisi, titreşimler veya hareketler aracılığıyla kullanıcıya fiziksel hisler verir. Örneğin, oyunda bir patlama meydana geldiğinde kumanda titreşerek oyuncunun etkiyi gerçekçi bir şekilde hissetmesini sağlar. Ayrıca, yürüyen veya koşan karakterlerin sesiyle hafif titreşimler senkronize edilerek daha gerçekçi bir deneyim sunulur. Bu tür bir dokunma teknolojisi geri bildirimi, oyuncuların oyun içinde meydana gelen çeşitli olayları fiziksel olarak hissetmelerini sağlar.

Bu teknoloji, oyuncuların oyuna daha dalmasını en üst düzeye çıkarıyor, duygusal tepkileri artırıyor ve oyunun dinamiklerini zenginleştiriyor. Android oyun kumandalarındaki dokunma ayarları, yalnızca oyun geliştiricilerin yaratıcı olanaklarını genişletmekle kalmaz, aynı zamanda oyunculara hiç olmadığı kadar gerçekçi bir oyun deneyimi sunar.

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))
    }
  }
}

Titreşimi kullanmak için bir özellik ve izin ayarlar.

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.VIBRATE"/>
  ...
</application>

VibratorManager ve Uygulama manifesti hakkında daha fazla bilgi edinin.

Hareket sensörleri

Oyun deneyimini geliştiren en yenilikçi teknolojilerden biri, hareket sensörüne sahip Android oyun kumandasıdır. Bu teknoloji, kullanıcıların fiziksel hareketlerini hassas bir şekilde algılayıp bu verileri oyun içinde işlemlere dönüştürerek daha sezgisel ve etkileyici bir oyun deneyimi sunar. Bu giriş bölümünde, Android oyun kumandalarındaki hareket sensörünün özelliklerini inceleyeceğiz.

Hareket sensörleri, kullanıcıların hareketlerini ve yönlerini algılamak için tipik olarak jiroskop ve ivme ölçerlerden yararlanır.

İvme ve jiroskop dinleyici sınıflarını uygulamalı ve bu dinleyicileri kumandanın sensör yöneticisine kaydetmelidir.

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) {
  }
}

Hareket sensörleri ve SensorEventListener hakkında daha fazla bilgi edinin.

Işıklar

Android oyun kumandalarındaki açık renk ayarları, görsel öğelerle oyuna yeni bir sürükleyicilik katar.

Işık rengi özelliği, farklı oyun senaryolarına dinamik olarak yanıt veren çeşitli renkleri göstermek için kumandadaki yerleşik LED ışıkları kullanır. Örneğin, bir oyuncunun sağlığı önemli olduğunda ışıklar kırmızı renkte yanıp sönebilir veya belirli bir görevin tamamlanmasının ardından yeşil renkte yanabilir. Böylece oyun içi etkinliklere dayalı görsel geri bildirim sağlanır. Bu açık renk ayarları kullanıcı etkileşimini derinleştirir, oyunun merakını ve zevkini artırır ve oyuncuların oyun dünyasına daha iyi alışmasına yardımcı olur.

Android oyun kumandalarındaki açık renk özellikleri sadece dekoratif bir amaç için değil, oyunun ruhunu belirleme ve kullanıcı deneyimini iyileştirme konusunda önemli bir rol oynar.

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())
        }
      }
    }
  }
}

Titreşimi kullanmak için bir özellik ve izin ayarlar.

<application ...>
  ...
  <uses-feature android:name="android.hardware.gamepad" android:required="true"/>
  <uses-permission android:name="android.permission.LIGHTS" />
  ...
</application>

LightsManager ve Uygulama manifesti hakkında daha fazla bilgi edinin.

Kumanda dokunmatik alanı

Bazı oyun kumandalarında, menülerde gezinmek veya oyun karakterlerini daha sezgisel bir şekilde kontrol etmek gibi çeşitli oyun içi işlemler için kullanılabilen dokunmatik alan bulunur.

Oyun kumandasındaki dokunmatik alan.
Şekil 1. Oyun kumandasındaki dokunmatik alan.

Entegre dokunmatik alanlı oyun kumandaları, Android'de doğrudan cihaz kontrolü sunar. Dokunmatik alana dokunduğunuzda ekranda bir fare işaretçisi oluşturulur, bu da fareye benzer sezgisel gezinmeye olanak tanır.