Bagikan melalui


Tongkat penerbangan

Halaman ini menjelaskan dasar-dasar pemrograman untuk tongkat penerbangan bersertifikat Xbox One menggunakan Windows.Gaming.Input.FlightStick dan API terkait untuk Platform Windows Universal (UWP).

Dengan membaca halaman ini, Anda akan mempelajari:

  • cara mengumpulkan daftar tongkat penerbangan yang terhubung dan pengguna mereka
  • cara mendeteksi bahwa tongkat penerbangan telah ditambahkan atau dihapus
  • cara membaca input dari satu atau beberapa tongkat penerbangan
  • bagaimana tongkat penerbangan berulah sebagai perangkat navigasi UI

Gambaran Umum

Tongkat penerbangan adalah perangkat input game yang dihargai untuk mereproduksi nuansa tongkat penerbangan yang akan ditemukan di kokpit pesawat atau pesawat ruang angkasa. Mereka adalah perangkat input yang sempurna untuk kontrol penerbangan yang cepat dan akurat. Tongkat penerbangan didukung di aplikasi Windows 10 atau Windows 11 dan Xbox One melalui namespace Windows.Gaming.Input .

Tongkat penerbangan bersertifikat Xbox One dilengkapi dengan kontrol berikut:

  • Joystick analog twistable yang mampu menggulung, melempar, dan yaw
  • Pembatasan analog
  • Dua tombol aktifkan
  • Sakelar topi digital 8 arah
  • Tombol Tampilan dan Menu

Catatan

Tombol Tampilan dan Menu digunakan untuk mendukung navigasi UI, bukan perintah gameplay, dan oleh karena itu tidak dapat diakses dengan mudah sebagai tombol joystick.

Navigasi antarmuka pengguna

Untuk meringankan beban mendukung perangkat input yang berbeda untuk navigasi antarmuka pengguna dan untuk mendorong konsistensi antara game dan perangkat, sebagian besar perangkat input fisik secara bersamaan bertindak sebagai perangkat input logis terpisah yang disebut pengontrol navigasi UI. Pengontrol navigasi UI menyediakan kosakata umum untuk perintah navigasi UI di seluruh perangkat input.

Sebagai pengontrol navigasi UI, tongkat penerbangan memetakan serangkaian perintah navigasi yang diperlukan ke tombol joystick dan View, Menu, FirePrimary, dan FireSecondary .

Perintah navigasi Input tongkat penerbangan
Naik Joystick ke atas
Tidak berfungsi Joystick ke bawah
Left Joystick kiri
Right Joystick kanan
Tampilkan Tombol Tampilan
Menu Tombol menu
Terima Tombol FirePrimary
Batalkan Tombol FireSecondary

Tongkat penerbangan tidak memetakan sekumpulan perintah navigasi opsional.

Mendeteksi dan melacak tongkat penerbangan

Mendeteksi dan melacak tongkat penerbangan bekerja dengan cara yang sama persis seperti halnya untuk gamepad, kecuali dengan kelas FlightStick alih-alih kelas Gamepad . Lihat Gamepad dan getaran untuk informasi selengkapnya.

Membaca tongkat penerbangan

Setelah mengidentifikasi tongkat penerbangan yang Anda minati, Anda siap untuk mengumpulkan input darinya. Namun, tidak seperti beberapa jenis input lain yang mungkin biasa Anda gunakan, tongkat penerbangan tidak berkomunikasi perubahan status dengan menaikkan peristiwa. Sebagai gantinya, Anda mengambil pembacaan rutin tentang status mereka saat ini dengan polling mereka.

Polling tongkat penerbangan

Polling menangkap rekam jepret tongkat penerbangan pada titik waktu yang tepat. Pendekatan pengumpulan input ini cocok untuk sebagian besar game karena logika mereka biasanya berjalan dalam perulangan deterministik daripada digerakkan oleh peristiwa. Biasanya juga lebih mudah untuk menginterpretasikan perintah game dari input yang dikumpulkan sekaligus daripada dari banyak input tunggal yang dikumpulkan dari waktu ke waktu.

Anda melakukan polling tongkat penerbangan dengan memanggil FlightStick.GetCurrentReading. Fungsi ini mengembalikan FlightStickReading yang berisi status tongkat penerbangan.

Contoh berikut melakukan polling tongkat penerbangan untuk statusnya saat ini:

auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();

Selain status tongkat penerbangan, setiap pembacaan mencakup tanda waktu yang menunjukkan dengan tepat ketika status diambil. Tanda waktu berguna untuk berkaitan dengan waktu pembacaan sebelumnya atau waktu simulasi permainan.

Membaca input joystick dan throttle

Joystick menyediakan pembacaan analog antara -1.0 dan 1.0 dalam sumbu X, Y, dan Z (roll, pitch, dan yaw, masing-masing). Untuk roll, nilai -1.0 sesuai dengan posisi joystick paling kiri, sementara nilai 1,0 sesuai dengan posisi paling kanan. Untuk pitch, nilai -1.0 sesuai dengan posisi joystick paling bawah, sementara nilai 1,0 sesuai dengan posisi paling atas. Untuk yaw, nilai -1,0 sesuai dengan posisi yang paling berlawanan arah jarum jam, sementara nilai 1,0 sesuai dengan posisi yang paling searah jarum jam.

Di semua sumbu, nilainya sekitar 0,0 ketika joystick berada di posisi tengah, tetapi normal bagi nilai yang tepat untuk bervariasi, bahkan di antara pembacaan berikutnya. Strategi untuk mengurangi variasi ini dibahas nanti di bagian ini.

Nilai roll joystick dibaca dari properti FlightStickReading.Roll, nilai pitch dibaca dari properti FlightStickReading.Pitch, dan nilai yaw dibaca dari properti FlightStickReading.Yaw:

// Each variable will contain a value between -1.0 and 1.0.
float roll = reading.Roll;
float pitch = reading.Pitch;
float yaw = reading.Yaw;

Saat membaca nilai joystick, Anda akan melihat bahwa mereka tidak menghasilkan pembacaan netral 0,0 dengan andal ketika joystick tidak aktif di posisi tengah; sebaliknya, mereka akan menghasilkan nilai yang berbeda mendekati 0,0 setiap kali joystick dipindahkan dan dikembalikan ke posisi tengah. Untuk mengurangi variasi ini, Anda dapat menerapkan deadzone kecil, yang merupakan rentang nilai di dekat posisi pusat ideal yang diabaikan.

Salah satu cara untuk menerapkan deadzone adalah dengan menentukan seberapa jauh joystick telah berpindah dari tengah, dan mengabaikan pembacaan yang lebih dekat dari beberapa jarak yang Anda pilih. Anda dapat menghitung jarak secara kasar—itu tidak tepat karena pembacaan joystick pada dasarnya polar, bukan planar, nilai—hanya dengan menggunakan teori Pythagorean. Ini menghasilkan deadzone radial.

Contoh berikut menunjukkan deadzone radial dasar menggunakan teori Pythagorean:

// Choose a deadzone. Readings inside this radius are ignored.
const float deadzoneRadius = 0.1f;
const float deadzoneSquared = deadzoneRadius * deadzoneRadius;

// Pythagorean theorem: For a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
float oppositeSquared = pitch * pitch;
float adjacentSquared = roll * roll;

// Accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) < deadzoneSquared)
{
    // Input accepted, process it.
}

Membaca tombol dan sakelar topi

Masing-masing dari dua tombol api tongkat penerbangan menyediakan pembacaan digital yang menunjukkan apakah itu ditekan (turun) atau dilepaskan (naik). Untuk efisiensi, pembacaan tombol tidak direpresentasikan sebagai nilai boolean individual—sebagai gantinya, semuanya dikemas ke dalam satu bitfield yang diwakili oleh enumerasi FlightStickButtons . Selain itu, sakelar topi 8 arah menyediakan arah yang dikemas ke dalam satu bitfield yang diwakili oleh enumerasi GameControllerSwitchPosition .

Catatan

Tongkat penerbangan dilengkapi dengan tombol tambahan yang digunakan untuk navigasi UI seperti tombol Tampilan dan Menu . Tombol-tombol ini bukan bagian FlightStickButtons dari enumerasi dan hanya dapat dibaca dengan mengakses tongkat penerbangan sebagai perangkat navigasi UI. Untuk informasi selengkapnya, lihat Pengontrol navigasi UI.

Nilai tombol dibaca dari properti FlightStickReading.Buttons . Karena properti ini adalah bitfield, masking bitwise digunakan untuk mengisolasi nilai tombol yang Anda minati. Tombol ditekan (ke bawah) ketika bit yang sesuai diatur; jika tidak, itu dirilis (naik).

Contoh berikut menentukan apakah tombol FirePrimary ditekan:

if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is pressed.
}

Contoh berikut menentukan apakah tombol FirePrimary dirilis:

if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
    // FirePrimary is released (not pressed).
}

Terkadang Anda mungkin ingin menentukan kapan tombol beralih dari ditekan untuk dilepaskan atau dilepaskan untuk ditekan, apakah beberapa tombol ditekan atau dilepaskan, atau jika satu set tombol disusun dengan cara tertentu—beberapa ditekan, beberapa tidak. Untuk informasi tentang cara mendeteksi setiap kondisi ini, lihat Mendeteksi transisi tombol dan Mendeteksi pengaturan tombol yang kompleks.

Nilai sakelar topi dibaca dari properti FlightStickReading.HatSwitch . Karena properti ini juga bitfield, masking bitwise kembali digunakan untuk mengisolasi posisi sakelar topi.

Contoh berikut menentukan apakah sakelar topi berada di posisi atas:

if (GameControllerSwitchPosition::Up == (reading.HatSwitch & GameControllerSwitchPosition::Up))
{
    // The hat switch is in the up position.
}

Contoh berikut menentukan apakah sakelar topi berada di posisi tengah:

if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
    // The hat switch is in the center position.
}

Baca juga