Bisakah gamepad menggantikan keyboard? Mencoba memprogram dengan tongkat

gambar


pengantar



Untuk mengetik di keyboard, duduk atau berdiri diam. Gamepad, sebaliknya, portabel dan kompak. Dengan mengontrolnya, Anda bisa berjalan di sekitar ruangan atau berbaring di sofa.



Karena jumlah tombol yang sedikit pada gamepad, tidak ada yang menganggapnya sebagai alat untuk memasukkan teks yang banyak, misalnya, dalam pemrograman.



Namun, stik analog (dan sebagian besar gamepad memiliki dua) memiliki potensi untuk memberikan opsi input yang tak terbatas. Pertanyaannya adalah memilih gerakan yang tepat untuk efisiensi maksimum dan ketegangan minimum pada ibu jari.



Ada banyak cara untuk memasukkan teks untuk gamepad. Jika Anda pernah memainkan game konsol, kemungkinan besar Anda pernah menggunakan salah satunya.





Entri teks di layar di Legend of Zelda



Dalam Legend of Zelda, pemain harus bergiliran memilih huruf menggunakan D-pad dengan panah dan setiap kali menekan tombol konfirmasi untuk menambahkan huruf ke kolom masukan teks.



Sejak itu, metode masukan yang lebih efisien telah dikembangkan. Jika Anda tertarik, baca artikel di Gamasutra .



Sayangnya, semua metode masukan yang saya temukan memiliki dua kekurangan utama yang membuatnya tidak cocok untuk pekerjaan serius:



  • Mereka tidak cukup cepat
  • Mereka membutuhkan umpan balik visual


Kebutuhan akan kecepatan jelas. Umpan balik visual tidak dapat diterima karena memakan ruang layar yang berharga dan mengalihkan perhatian pengguna, yang dapat mengganggu aliran dan memperlambat.



Namun, jika tidak ada umpan balik, semua gerakan harus dihafal dan dipraktikkan sampai Anda dapat memasukkannya dengan cukup akurat. Video game tidak mungkin memaksa pengguna menghabiskan beberapa minggu untuk mempelajari cara memasukkan teks, tetapi untuk cara memasukkan teks yang dapat digunakan dalam program apa pun, harganya dapat diterima, dan pelatihan itu sendiri seperti menguasai input sentuh.



Dalam posting ini, saya akan memandu Anda secara singkat melalui langkah-langkah yang terlibat dalam membuat sistem input teks untuk gamepad yang cocok sebagai pengganti input keyboard volumetrik.



Memutuskan gerakan



Untuk memulainya, saya membuat alat untuk memvisualisasikan pergerakan tongkat gamepad analog berdasarkan pygamebahasa Python. Untuk kejelasan, saya menambahkan alat tersebut sehingga tidak hanya menunjukkan posisi tongkat saat ini, tetapi juga posisi sebelumnya dengan warna abu-abu yang semakin terang, sehingga Anda dapat melihat jalur di mana tongkat bergerak.



Gambar di bawah ini menunjukkan gerakan simultan dari kedua tongkat analog ke dalam, ke atas, ke luar, ke bawah, ke dalam lagi, dan kembali ke tengah.





Memvisualisasikan pola pergerakan stik analog



Hal pertama yang saya perhatikan adalah karena status netral gamepad adalah menemukan stik di tengah, semua opsi input harus dapat dijangkau dari kondisi netral ini dan semuanya harus diakhiri dengan kembalinya stik ke tengah.



Dengan mengingat keterbatasan ini, saya menemukan bahwa masukan yang paling sederhana adalah memindahkan salah satu tongkat ke segala arah dan kembali ke tengah.





Tongkat kiri telah bergerak ke atas dan kembali ke tengah.



Berapa banyak arah dan arah mana yang bisa Anda pilih secara membabi buta? Perhatikan contoh berikut.





Tongkat kiri digerakkan ke atas, bawah, tengah, kiri dan kanan, dan tongkat kanan digerakkan secara diagonal



Beberapa menit percobaan menunjukkan bahwa dimungkinkan untuk memilih arah secara akurat di sepanjang sumbu, dan input ke arah lain jauh lebih tidak akurat (seperti yang terlihat pada gambar sebelumnya).



Metode masukan paling sederhana berikutnya yang ditemukan adalah gerakan melingkar satu tahap dan dua tahap.





Tongkat kiri digerakkan ke atas, ke kiri dan kembali ke tengah





Tongkat kiri bergerak ke atas, kiri, bawah, dan kembali ke tengah.



Dengan mempertimbangkan semua gerakan yang ditemukan sejauh ini, kami mendapat 4 + 8 + 8 = 20 opsi masukan pada setiap tongkat.



Tentu saja, kedua tongkat dapat dipindahkan secara bersamaan, membuat isyarat masukan gabungan.





Kedua tongkat bergerak ke atas dan kembali ke tengah pada saat yang bersamaan.Ketika



Anda menggabungkan gerakan, total 20 * 20 + 20 + 20 = 440 opsi masukan diperoleh, yang menurut saya sudah lebih dari cukup.



Menyandikan isyarat



Saya membagi ruang input setiap tongkat menjadi 4 sektor dan menetapkan nomor untuk setiap sektor.



Ruang input dibagi menjadi beberapa sektor


Ruang input dibagi menjadi beberapa sektor



Kemudian saya menetapkan area ambang di sekitar pusat untuk membantu menentukan apakah tongkat berada pada posisi netral, atau di salah satu sektor.





Kusen melingkar mengelilingi bagian tengah



Seperti yang Anda lihat, jari-jari ambang cukup besar. Melalui eksperimen, saya telah menentukan bahwa ini adalah radius terbaik yang memberikan jumlah kesalahan paling sedikit.



Ketika salah satu tongkat tidak berada di tengah, melintasi area ambang, urutan input dimulai. Ketika kedua tongkat kembali ke tengah di dalam area ambang, urutan dianggap lengkap dan diubah menjadi sepasang tupel yang menggambarkan pergerakan tongkat.



Gerakan tongkat untuk input ((0,), (2, 3))


Pindahkan tongkat untuk input ((0,), (2, 3))



Menghubungkan isyarat dengan tindakan



Dalam hal ini, tindakannya hanyalah tombol keyboard. Tombol pemicu Gamepad dapat diikat ke tombol Shift, Ctrl, Alt dan Super, yang memudahkan karena tombol ini digunakan dalam kombinasi (misalnya, Ctrl-C).



Untuk menentukan pengikatan optimal dari isyarat dan kunci yang dimasukkan, saya menggunakan keylogger untuk merekam semua penekanan tombol dan menganalisis frekuensi setiap tombol selama beberapa minggu.



Tombol yang paling sering ditekan harus dikaitkan dengan gerakan yang paling sederhana (dan karenanya tercepat). Saya memperkirakan kompleksitas gerakan dengan menambahkan panjang input dari setiap tongkat. Misalnya, input yang ditunjukkan di atas ((0,), (2, 3)) memiliki kompleksitas 1 + 2 = 3.



Dalam hal ini, saat memasukkan dari satu tongkat, penggunaan dua tongkat secara bergantian akan lebih cepat daripada beberapa input dari tongkat yang sama, jadi seringkali lebih baik untuk mengikat kunci yang akan diketik ke tongkat yang berbeda.



Mengikuti logika ini, saya pertama kali menghasilkan semua opsi masukan yang mungkin dari satu tongkat dan mengelompokkannya berdasarkan kesulitan. Saya menghitung jumlah input di setiap kelompok kesulitan dan mengambil jumlah kunci dari daftar kunci yang paling sering diurutkan.



Tujuan saya adalah membagi kunci ini menjadi dua kelompok, satu untuk masukan tongkat kiri dan satu lagi untuk tongkat kanan. Untuk menemukan grup yang ideal, saya membuat grafik di mana node adalah kuncinya, dan tepi berbobot adalah frekuensi kombinasi tombol.



Saya secara siklis menghilangkan tepi dengan bobot paling kecil sampai grafik menjadi bipartit. Jika grafik menjadi terputus, saya secara rekursif menerapkan algoritme partisi ke komponen yang terhubung, dan akhirnya menggabungkan grup menjadi set independen.



Perhatikan contoh berikut. Kelompok kompleksitas pertama terdiri dari semua input dengan kompleksitas 1, yaitu ((0,), ()), ((1,), ()), ((2,), ()), ((3,), ()), ((), (0,)), ((), (1,)), ((), (2,)), ((), (3,)).



Ada 8 masukan dalam grup ini, jadi kami mengambil 8 kunci yang paling sering dari daftar yang diurutkan. Ini dia 'e', 'o', 't', 'a', 'i', 's', 'j', 'r'. Buat grafik dengan tombol-tombol ini sebagai simpul dan tetapkan bobot ke tepi antara simpul-simpul ini sesuai dengan frekuensi setiap kombinasi tombol.



Tombol e dan r paling sering digabungkan, sehingga harus dipasang ke tongkat yang berbeda.



Saat menghilangkan tepi yang lemah dari grafik, cepat atau lambat akan berubah menjadi tidak terhubung.

Kunci j sering tetapi terisolasi.


Kunci j biasa digunakan, tetapi terisolasi.



Anda mungkin bertanya-tanya mengapa kunci tersebut jadalah salah satu dari 8 kunci yang paling sering, tetapi memiliki hubungan yang lemah ke kunci yang sering digunakan lainnya. Alasannya adalah ini jsecara aktif digunakan saat bekerja dengan VIM plus, di sistem saya ini adalah bagian dari kombinasi hotkey untuk beralih antar jendela. Oleh karena itu, ini lebih sering digunakan dalam isolasi daripada di teks.



Karena grafik terputus, saya terus menerapkan algoritme ke komponen yang terhubung. Sebuah subgrafik yang hanya terdiri dari satu node jsudah bipartite ( j+ set kosong). Saya menerapkan algoritma secara rekursif ke komponen lain.

Komponen bipartit setelah menghilangkan tepi terlemah


Setelah menghilangkan edge yang paling lemah, komponen tersebut menjadi bipartit,



kemudian komponen tersebut dapat dengan mudah dipecah menjadi dua grup tanpa tepi di antara node dalam grup tersebut.

Gambar komponen bipartit


Skema Komponen Bipartit



Pada akhirnya, saya menggabungkan set bipartit.

Pengelompokan terakhir untuk 8 kunci pertama


Pengelompokan yang diperoleh untuk 8 tombol pertama



Seperti yang Anda lihat, tautan terkuat (pintasan keyboard yang paling sering) terletak di antara node di sisi yang berbeda, persis seperti yang saya inginkan.



Saya mengulangi proses ini untuk kelompok kesulitan lain (hanya masukan tongkat tunggal.) Kemudian saya menghasilkan semua masukan gabungan yang mungkin, mengelompokkannya lagi berdasarkan kesulitan, dan menetapkan kunci yang tersisa ke opsi masukan tersebut. Karena input gabungan memerlukan penggunaan kedua tongkat, masalah membagi kunci menjadi dua kelompok tidak muncul di sini.



Saya menggunakan paket pyautoguiPython untuk menghasilkan acara keyboard ketika tindakan dipicu.



Praktek



Saya menggunakan pelatih sentuh yang sama dengan yang saya ktouchgunakan untuk mengajar mengetik hampir dua dekade lalu. Untuk tujuan ini, saya telah membuat pelajaran khusus.



Berlatih mengetik sentuh gamepad di ktouch


Mempraktikkan input analog pada gamepad di ktouch



Pengamatan



  • Meskipun proses Python yang menjalankan sistem input ini biasanya menghabiskan tidak lebih dari 10% sumber daya prosesor, jika harus terus berjalan di latar belakang, saya akan mengimplementasikannya kembali dan mengoptimalkannya dalam bahasa tingkat yang lebih rendah sehingga prosesor dapat melakukan lebih banyak tugas yang mahal.
  • Setelah membeli gamepad DualShock4, saya menyadari bahwa saya dapat melakukan input diagonal dengan cukup akurat. Integrasi masukan diagonal akan mengurangi jumlah opsi masukan yang lebih kompleks, dan karenanya meningkatkan kecepatan.
  • , . , . , , , .
  • , . , , .
  • . .




Hanya dalam beberapa hari, saya membuat sistem input yang efisien untuk gamepad. Ada banyak perbaikan yang dapat dilakukan, tetapi pemeriksaan konsep ini menunjukkan bahwa input teks yang efisien pada gamepad adalah mungkin. Kode proyek diposting di github .



All Articles