Saya punya pengontrol XBox360 yang ingin saya gunakan sebagai input untuk suatu aplikasi.
Apa yang tidak bisa saya lakukan adalah cara praktik terbaik untuk mengekspos ini melalui antarmuka.
Di belakang layar, kelas yang menangani pengontrol bergantung pada status tombol polling.
Saya awalnya mencoba sesuatu tautan:
Event ButtonPressed() as ButtonEnum
mana ButtonEnum
itu ButtonRed
, ButtonStart
, dll ...
Ini sedikit terbatas karena hanya mendukung penekanan tombol, tidak menahan / pola (tekan dua kali, dll.)
Gagasan berikutnya adalah dengan hanya mengekspos keadaan tombol ke aplikasi misalnya
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
Ini sangat fleksibel tetapi benar-benar memaksa terlalu banyak pekerjaan ke dalam aplikasi dan membutuhkan aplikasi untuk polling - Saya lebih suka event driven jika memungkinkan.
Saya mempertimbangkan untuk menambahkan beberapa acara, misalnya:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
tapi ini agak kikuk dan terasa sangat menyakitkan di layar "Bind button".
Dapatkah seseorang tolong tunjukkan saya di "benar" cara untuk menangani input dari pengontrol.
NB: Saya menggunakan SlimDX di dalam kelas yang mengimplementasikan antarmuka. Ini memungkinkan saya untuk membaca status dengan sangat mudah. Setiap alternatif yang akan menyelesaikan masalah saya juga dihargai
Jujur, menurut saya antarmuka yang optimal akan sangat bergantung pada penggunaan dalam game. Namun, untuk skenario penggunaan umum, saya akan menyarankan arsitektur dua tingkat yang memisahkan pendekatan berbasis peristiwa dan polling.
Tingkat lebih rendah dapat dianggap tingkat "berdasarkan polling", dan memperlihatkan keadaan tombol saat ini. Satu antarmuka seperti itu hanya dapat memiliki 2 fungsi,
GetAnalogState(InputIdentifier)
dan diGetDigitalState(InputIdentifier)
manaInputIdentifier
nilai yang disebutkan mewakili tombol, pemicu atau tongkat mana yang Anda periksa. (Menjalankan GetAnalogState untuk sebuah tombol akan mengembalikan 1.0 atau 0.0, dan menjalankan GetDigitalState untuk stik analog akan mengembalikan true jika melewati ambang preset, atau false jika tidak).Tingkat kedua kemudian akan menggunakan tingkat yang lebih rendah untuk menghasilkan peristiwa setelah perubahan keadaan, dan memungkinkan elemen mendaftar untuk panggilan balik (C # Acara sangat mulia). Callback ini akan mencakup acara untuk pers, rilis, ketuk, longhold, dll. Untuk tongkat analog, Anda dapat memasukkan gerakan, misalnya QCF untuk game pertempuran. Jumlah acara yang terbuka tergantung pada seberapa detail acara yang ingin Anda kirim. Anda bisa saja menembakkan yang sederhana
ButtonStateChanged(InputIdentifier)
jika Anda ingin menangani yang lainnya dalam logika yang terpisah.Jadi, jika Anda perlu memeriksa keadaan tombol input atau tongkat kontrol saat ini, periksa tingkat bawah. Jika Anda hanya ingin mematikan fungsi pada acara masukan, daftar panggilan balik dari tingkat kedua.
sumber