অতিরিক্ত নিয়ামক বৈশিষ্ট্য

গেম কন্ট্রোলারগুলিতে অতিরিক্ত বৈশিষ্ট্য রয়েছে যা খেলোয়াড়দের মিথস্ক্রিয়া এবং নিমজ্জন উল্লেখযোগ্যভাবে বৃদ্ধি করে। অ্যান্ড্রয়েড গেম কন্ট্রোলারগুলির হ্যাপটিক্স, মোশন সেন্সর এবং আলোর কার্যকারিতা গেমিং অভিজ্ঞতাকে আরও গভীর এবং সমৃদ্ধ করার ক্ষেত্রে বিশেষভাবে গুরুত্বপূর্ণ। প্রতিটি বৈশিষ্ট্য অনন্যভাবে খেলোয়াড়ের ইন্দ্রিয়কে উদ্দীপিত করে, গেমের মধ্যে আরও অর্থপূর্ণ এবং স্বজ্ঞাত মিথস্ক্রিয়াকে উৎসাহিত করে।

হ্যাপটিক্স

অ্যান্ড্রয়েড গেম কন্ট্রোলারে হ্যাপটিক্স বৈশিষ্ট্যটি একটি গুরুত্বপূর্ণ প্রযুক্তি যা গেমপ্লের সময় বাস্তবসম্মত স্পর্শকাতর প্রতিক্রিয়া প্রদান করে।

হ্যাপটিক্স প্রযুক্তি ব্যবহারকারীকে কম্পন বা নড়াচড়ার মাধ্যমে শারীরিক সংবেদন প্রদান করে। উদাহরণস্বরূপ, যখন গেমটিতে একটি বিস্ফোরণ ঘটে, তখন কন্ট্রোলার কম্পিত হয়, যার ফলে খেলোয়াড় বাস্তবসম্মতভাবে প্রভাব অনুভব করতে পারে। উপরন্তু, সূক্ষ্ম কম্পনগুলি একটি চরিত্রের হাঁটা বা দৌড়ানোর শব্দের সাথে সিঙ্ক্রোনাইজ করা যেতে পারে, যা আরও জীবন্ত অভিজ্ঞতা প্রদান করে। এই ধরণের হ্যাপটিক্স প্রতিক্রিয়া খেলোয়াড়দের গেমের মধ্যে ঘটে যাওয়া বিভিন্ন ঘটনা শারীরিকভাবে অনুভব করতে সক্ষম করে।

এই প্রযুক্তি খেলোয়াড়দের নিমজ্জন সর্বাধিক করে তোলে, আবেগগত প্রতিক্রিয়া বৃদ্ধি করে এবং গেমের গতিশীলতাকে সমৃদ্ধ করে। অ্যান্ড্রয়েড গেম কন্ট্রোলারে হ্যাপটিক্স সেটিংস কেবল গেম ডেভেলপারদের জন্য সৃজনশীল সম্ভাবনাকে প্রসারিত করে না বরং খেলোয়াড়দের আগের চেয়ে আরও বাস্তবসম্মত গেমিং অভিজ্ঞতা প্রদান করে।

কোটলিন

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

জাভা

public void triggerVibrationMultiChannel(
    int deviceId, int leftIntensity, int leftDuration,
    int rightIntensity, int rightDuration) {

    InputDevice inputDevice = InputDevice.getDevice(deviceId);

    // Check if device exists to avoid NullPointerException
    if (inputDevice == null) {
      return;
    }

    VibratorManager vibratorManager = inputDevice.getVibratorManager();
    if (vibratorManager != null) {
        int[] vibratorIds = vibratorManager.getVibratorIds();
        int vibratorCount = vibratorIds.length;

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

public void updateVibrator(Vibrator vibrator, int intensity, int duration) {
    if (vibrator != null) {
        if (intensity == 0) {
            vibrator.cancel();
        } else if (duration > 0) {
            vibrator.vibrate(VibrationEffect.createOneShot. ((long) duration, intensity));
        }
    }
}

ভাইব্রেট ব্যবহার করার জন্য, এটি একটি বৈশিষ্ট্য এবং অনুমতি সেট করে।

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

VibratorManager এবং অ্যাপ ম্যানিফেস্ট সম্পর্কে আরও তথ্যের জন্য।

মোশন সেন্সর

গেমপ্লে অভিজ্ঞতা বৃদ্ধির জন্য সবচেয়ে উদ্ভাবনী প্রযুক্তিগুলির মধ্যে একটি হল মোশন সেন্সর-সজ্জিত অ্যান্ড্রয়েড গেম কন্ট্রোলার। এই প্রযুক্তি ব্যবহারকারীদের শারীরিক গতিবিধি সঠিকভাবে সনাক্ত করে এবং সেই ডেটাকে গেমের মধ্যে ক্রিয়ায় রূপান্তরিত করে, যা আরও স্বজ্ঞাত এবং নিমজ্জিত গেমিং অভিজ্ঞতা প্রদান করে। এই ভূমিকায়, আমরা অ্যান্ড্রয়েড গেম কন্ট্রোলারগুলিতে মোশন সেন্সর বৈশিষ্ট্যগুলি কীভাবে কাজ করে তা অন্বেষণ করব।

মোশন সেন্সরগুলিতে সাধারণত জাইরোস্কোপ এবং অ্যাক্সিলোমিটার থাকে যা ব্যবহারকারীদের গতিবিধি এবং অভিমুখ সনাক্ত করে।

এটিকে ত্বরণ এবং জাইরোস্কোপ শ্রোতা ক্লাস বাস্তবায়ন করতে হবে এবং এই শ্রোতাদের নিয়ামকের সেন্সর ম্যানেজারের সাথে নিবন্ধন করতে হবে।

কোটলিন

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

জাভা


public void setIntegratedAccelerometerActive(int deviceId) {
    InputDevice device = InputDevice.getDevice(deviceId);
    // Safe handling for null device or sensor manager
    if (device == null) {
      return;
    }
    SensorManager sensorManager = device.getSensorManager();
    if (sensorManager == null) {
      return;
    }

    Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    if (accelerometer != null) {
      GameControllerAccelerometerListener   accelerometerListener =
          new GameControllerAccelerometerListener(accelerometer);
        sensorManager.registerListener(
          accelerometerListener, accelerometer,
          SensorManager.SENSOR_DELAY_GAME
        );
    }
}

public void setIntegratedGyroscopeActive(int deviceId) {
    InputDevice device = InputDevice.getDevice(deviceId);
    if (device == null) {
        return;
    }
    SensorManager sensorManager = device.getSensorManager();
    if (sensorManager == null) {
        return;
    }
    Sensor gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
    if (gyroscope != null) {
        GameControllerGyroscopeListener gyroscopeListener =
          new GameControllerGyroscopeListener(gyroscope);
        sensorManager.registerListener(
          gyroscopeListener, gyroscope,
          SensorManager.SENSOR_DELAY_GAME
        );
    }
}

public static class GameControllerAccelerometerListener implements SensorEventListener {
    private final Sensor listenerAccelerometer;
    public GameControllerAccelerometerListener(Sensor   listenerAccelerometer) {
        this.listenerAccelerometer = listenerAccelerometer;
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (listenerAccelerometer != null) {
            synchronized (listenerAccelerometer) {
                if (event.sensor == listenerAccelerometer) {
                    Log.d("Accelerometer",
                      "onSensorChanged " + event.values[0] + ", "
                      + event.values[1] + ", " + event.values[2]);
                }
            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

public static class GameControllerGyroscopeListener implements SensorEventListener {
    private final Sensor listenerGyroscope;

    public GameControllerGyroscopeListener(Sensor listenerGyroscope) {
        this.listenerGyroscope = listenerGyroscope;
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (listenerGyroscope != null) {
            synchronized (listenerGyroscope) {
                if (event.sensor == listenerGyroscope) {
                    Log.d("Gyroscope",
                      "onSensorChanged " + event.values[0] +  ", " +
                        event.values[1] + ", " + event.values  [2]);
                }
            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}

মোশন সেন্সর এবং 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())
        }
      }
    }
  }
}

জাভা

public void changeControllerLightColor(int deviceId, int  color) {
    InputDevice device = InputDevice.getDevice(deviceId);

    if (device != null) {
      // Check if the device is a joystick.
      // Note: Parentheses are required around the bitwise AND operation in Java
      // because == has higher precedence than &.
        if ((device.getSources() & InputDevice.  SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) {
            LightsManager lightsManager = device.getLightsManager();

            if (lightsManager != null) {
                for (Light light : lightsManager.getLights()) {
                    LightState.Builder stateBuilder = new   LightState.Builder();
                    stateBuilder.setColor(color);

                    LightsRequest.Builder requestBuilder = new LightsRequest.Builder();
                    requestBuilder.addLight(light, stateBuilder.build());

                    LightsManager.Session 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 এবং অ্যাপ ম্যানিফেস্ট সম্পর্কে আরও তথ্যের জন্য।

কন্ট্রোলার টাচপ্যাড

কিছু গেম কন্ট্রোলারে একটি টাচপ্যাড থাকে যা বিভিন্ন ধরণের ইন-গেম অ্যাকশনের জন্য ব্যবহার করা যেতে পারে, যেমন মেনু নেভিগেট করা বা আরও স্বজ্ঞাত উপায়ে গেমের চরিত্রগুলিকে নিয়ন্ত্রণ করা।

গেম কন্ট্রোলারের টাচপ্যাড
চিত্র ১. গেম কন্ট্রোলারের টাচপ্যাড।

ইন্টিগ্রেটেড টাচপ্যাড সহ গেম কন্ট্রোলারগুলি অ্যান্ড্রয়েডে সরাসরি ডিভাইস নিয়ন্ত্রণ অফার করে। টাচপ্যাড স্পর্শ করলে একটি অন-স্ক্রিন মাউস পয়েন্টার তৈরি হয়, যা স্বজ্ঞাত মাউসের মতো নেভিগেশনের অনুমতি দেয়।