เกมคอนโทรลเลอร์มีฟีเจอร์เพิ่มเติมที่ช่วย เพิ่มการโต้ตอบและการดื่มด่ำของผู้เล่นได้อย่างมาก ฟังก์ชันการทำงานของระบบสัมผัส เซ็นเซอร์ตรวจจับความเคลื่อนไหว และแสง ของเกมคอนโทรลเลอร์ Android มีประโยชน์อย่างยิ่งในการ ยกระดับและเพิ่มอรรถรสในการเล่นเกม ฟีเจอร์แต่ละอย่างจะกระตุ้นประสาทสัมผัสของผู้เล่นในแบบที่ไม่เหมือนใคร เพื่อส่งเสริมการโต้ตอบที่สื่อความหมายและเป็นธรรมชาติมากขึ้นภายในเกม
การโต้ตอบการสัมผัส
ฟีเจอร์การสั่นในอุปกรณ์ควบคุมเกม Android เป็นเทคโนโลยีที่สำคัญซึ่ง ให้การตอบสนองแบบสัมผัสที่สมจริงระหว่างการเล่นเกม
เทคโนโลยีการสัมผัสจะส่งความรู้สึกทางกายภาพไปยังผู้ใช้ผ่านการสั่น หรือการเคลื่อนไหว เช่น เมื่อเกิดการระเบิดในเกม คอนโทรลเลอร์จะสั่น เพื่อให้ผู้เล่นรู้สึกถึงแรงกระแทกได้อย่างสมจริง นอกจากนี้ การสั่นเบาๆ ยังซิงค์กับเสียงตัวละครเดินหรือ วิ่งได้ด้วย ซึ่งจะช่วยให้ได้รับประสบการณ์ที่สมจริงยิ่งขึ้น การตอบสนองแบบสัมผัสประเภทนี้ ช่วยให้ผู้เล่นรู้สึกถึงเหตุการณ์ต่างๆ ที่เกิดขึ้นภายในเกมได้
เทคโนโลยีนี้ช่วยให้ผู้เล่นดื่มด่ำกับเกมได้อย่างเต็มที่ ขยายการตอบสนองทางอารมณ์ และ เพิ่มความน่าสนใจของเกม การตั้งค่าการสั่นในเกมคอนโทรลเลอร์ของ Android ไม่เพียงขยายความเป็นไปได้ในการสร้างสรรค์สำหรับนักพัฒนาเกม แต่ยังมอบ ประสบการณ์การเล่นเกมที่สมจริงยิ่งกว่าที่เคยให้กับผู้เล่นด้วย
Kotlin
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))
}
}
}
Java
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 และ
ไฟล์ Manifest ของแอป
เซ็นเซอร์ตรวจจับความเคลื่อนไหว
เทคโนโลยีที่ล้ำสมัยที่สุดอย่างหนึ่งที่ช่วยยกระดับประสบการณ์การเล่นเกมคือ อุปกรณ์ควบคุมเกม Android ที่มีเซ็นเซอร์ตรวจจับความเคลื่อนไหว เทคโนโลยีนี้จะตรวจจับการเคลื่อนไหวทางกายภาพของผู้ใช้อย่างแม่นยำ และแปลงข้อมูลนั้นเป็นการกระทํา ภายในเกม ซึ่งจะมอบประสบการณ์การเล่นเกมที่สมจริงและใช้งานง่ายยิ่งขึ้น ในบทนำนี้ เราจะมาดูวิธีการทำงานของฟีเจอร์เซ็นเซอร์ตรวจจับความเคลื่อนไหวใน เกมคอนโทรลเลอร์ Android
โดยปกติแล้ว เซ็นเซอร์ตรวจจับความเคลื่อนไหวจะใช้เครื่องวัดการหมุนและตัวตรวจวัดความเร่งเพื่อตรวจจับ การเคลื่อนไหวและการวางแนวของผู้ใช้
โดยต้องใช้คลาสตัวฟังการหมุนและตัวฟังการเร่งความเร็ว และลงทะเบียน ตัวฟังเหล่านี้กับเครื่องมือจัดการเซ็นเซอร์ของคอนโทรลเลอร์
Kotlin
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) {
}
}
Java
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
ไฟ
การตั้งค่าสีไฟบนตัวควบคุมเกม Android จะเพิ่มมิติใหม่ของ การดื่มด่ำไปกับการเล่นเกมผ่านองค์ประกอบภาพ
ฟีเจอร์สีของแสงใช้ไฟ LED ในตัวของคอนโทรลเลอร์เพื่อ แสดงสีต่างๆ ซึ่งจะตอบสนองแบบไดนามิกต่อสถานการณ์การเล่นเกมที่แตกต่างกัน เช่น ไฟอาจกะพริบเป็นสีแดงเมื่อผู้เล่นมีสุขภาพอยู่ในขั้นวิกฤต หรือ เรืองแสงเป็นสีเขียวเมื่อทำภารกิจที่เฉพาะเจาะจงสำเร็จ ซึ่งจะให้ความคิดเห็นด้วยภาพ ตามเหตุการณ์ในเกม การตั้งค่าสีอ่อนเหล่านี้ช่วยเพิ่มการมีส่วนร่วมของผู้ใช้ เพิ่มความระทึกใจและความสนุกของเกม และช่วยให้ผู้เล่นดื่มด่ำกับโลกของเกมได้ อย่างเต็มที่
ฟีเจอร์สีอ่อนในเกมคอนโทรลเลอร์ของ Android ไม่ได้มีไว้เพื่อตกแต่งเท่านั้น แต่ยังมีบทบาทสำคัญในการกำหนดอารมณ์ของเกมและปรับปรุงประสบการณ์ของผู้ใช้
Kotin
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())
}
}
}
}
}
Java
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 และ
ไฟล์ Manifest ของแอป
ทัชแพดของคอนโทรลเลอร์
เกมคอนโทรลเลอร์บางรุ่นมีทัชแพดที่ใช้สำหรับ การดำเนินการในเกมได้หลากหลาย เช่น การไปยังส่วนต่างๆ ของเมนูหรือการควบคุมตัวละครในเกมด้วยวิธีที่ ใช้งานง่ายยิ่งขึ้น
เกมคอนโทรลเลอร์ที่มีทัชแพดในตัวช่วยให้ควบคุมอุปกรณ์ได้โดยตรงบน Android การแตะทัชแพดจะสร้างเคอร์เซอร์เมาส์บนหน้าจอ ซึ่งช่วยให้ การนำทางคล้ายเมาส์เป็นไปอย่างราบรื่น