Bagaimana saya bisa menangani tata letak keyboard yang berbeda?

10

Katakanlah saya memiliki game yang menggunakan kontrol WASD pada tata letak QWERTY. Mencoba menggunakan kontrol ini pada, katakanlah, tata letak Dvorak tidak ideal (setara dengan <A:Hpada QWERTY). Jelas, saya ingin menggunakan kunci fisik yang sama seperti yang akan digunakan QWERTY ( ,aoepada DVORAK).

Saya telah menemukan beberapa solusi yang mungkin:

  • Paksa pengguna untuk menggunakan QWERTY
    • jelas tidak ideal, terutama bagi pengguna internasional
  • Ubah pintasan berdasarkan tata letak keyboard (WASD ->, aoe)
    • memaksa saya untuk membuat peta tata letak untuk setiap tata letak yang didukung (automatable)
    • termudah bagi pengguna jika ada lebih banyak cara pintas dari sekadar WASD
  • Paksa pengguna untuk menentukan pintasan sendiri
    • Lebih fleksibel
    • Mengganggu jika ada banyak cara pintas
    • Dapat digunakan bersamaan dengan opsi kedua
  • Gunakan kode kunci perangkat keras
    • konsisten di seluruh keyboard?

Bagaimana hal semacam ini biasanya ditangani?

hajar
sumber

Jawaban:

9

Dengarkan kode pindai. Cara ini dilakukan tergantung pada OS Anda, yang tidak Anda daftarkan. Di Windows, Anda bisa mendapatkan kode kunci kode kunci virtual yang diberikan dari WM_KEYDOWN dan teman-teman dengan menggunakan MapVirtualKey . Kode pindai didasarkan pada kunci fisik dan tidak terpengaruh oleh tata letak.

Selamat membaca http://www.altdevblogaday.com/2011/10/02/i-never-managed-to-go-left-on-first-try/ .

Jadi ya, seperti yang dikatakan Nicol Bolas, Anda bisa dan harus membiarkan pengguna mengatasinya. Tetapi hanya membuatnya berfungsi langsung dari kotak tidak sulit dan pengguna Anda akan menghargainya.

Perhatikan bahwa Anda (mungkin) salah menangani input karakter, seperti sebagian besar pengembang game. Pastikan untuk teks, Anda selalu menggunakan WM_CHAR (atau yang setara di OS lain) daripada menggunakan WM_KEYDOWN untuk input teks. Sangat keliru untuk mengasumsikan bahwa ketika tombol 'a' ditekan, Anda harus memasukkan 'a' ke kontrol input teks, karena penggunaan Dead Keys pada beberapa tata letak. Anda juga dapat mendukung IME (atau yang setara dengan OS) untuk pasar Asia Timur yang memiliki karakter jauh lebih banyak daripada yang bisa masuk pada keyboard, dan perlu mengetikkan UI khusus. Menangani IME dalam sebuah game memang menyebalkan (menanganinya memang menyebalkan), tapi sepadan dengan pendapat saya untuk meningkatkan daya tarik produk Anda ke pasar yang jauh lebih besar. Sekali lagi, WM_KEYDOWN tidak pernah digunakan untuk teks.

Sean Middleditch
sumber
Saran yang bagus. Saya tidak mencantumkan OS karena saya mencari pedoman umum / harapan (saya dapat menangani detail implementasi).
beatgammit
6

Anda harus selalu memberi pemain kemampuan untuk mengubah tugas utama mereka. Begitulah "biasanya ditangani": biarkan pemain mengubahnya. Beberapa pemain akan mengatur keyboard mereka ke QWERTY ketika mereka bermain game karena itulah yang diharapkan sebagian besar game. Beberapa akan membiarkan mereka diatur ke keyboard mereka saat ini dan bergantung pada kemampuan untuk mengubah tombol.

Nicol Bolas
sumber
1
Bagaimana dengan saat bahasanya diubah? Misalnya, apakah orang Prancis berharap untuk mengubah WASD -> ZQSD jika mereka ingin mempertahankan tata letak AZERTY mereka, bahkan jika gim ini dalam bahasa Prancis?
beatgammit
1
@jameson: Apakah Anda membaca jawaban saya? Biarkan mereka mendefinisikan ulang tugas utama mereka . Maka tidak akan ada masalah.
Nicol Bolas
1
Ya, saya sudah membaca jawaban Anda, dan saya mungkin akan pergi dengan saran Anda. Saya hanya ingin memastikan tidak ada harapan saat pengiriman ke pengguna di berbagai tempat.
beatgammit
3

Dalam hal ini Anda tidak dapat mendengarkan kode pindai (seperti misalnya ketika mengembangkan permainan flash) Anda dapat membuat pengikatan kunci yang berfungsi untuk tata letak sebanyak mungkin. Sebagian besar tata letak keyboard sangat mirip, hanya dengan beberapa pengecualian.

Layout keyboard yang mengikuti ISO 9995 (sebagian besar) disusun seperti ini:

Tata letak keyboard setelah ISO

Pada dasarnya kunci hitam aman digunakan.

API-Beast
sumber
Untuk detail lebih lanjut tentang tata letak papan ketik, lihat QWERTY , QWERTZ , AZERTY , dan QZERTY
Chuck Walbourn
3

Sebagian besar game beranggaran besar (yang memiliki distributor internasional) akan bekerja di luar kotak, menggunakan ZQSD alih-alih WASD untuk layout azerty. Gim yang layak juga akan memperkenalkan tata letak di tingkat pertama, yang lain akan membiarkan pemain menemukannya melalui layar penyesuaian. Strategi implementasi dapat dideteksi dengan meminta OS untuk mengganti tata letak. Entah permainan menggunakan scancodes (posisi) secara internal, dan memetakannya keycode (simbol) saat menampilkan dialog konfigurasi dan konfirmasi; atau menggunakan kode kunci secara internal, dan mendeteksi tata letak saat startup atau pada peluncuran pertama.

Strategi pertama (scancodes internal) lebih kuat, tetapi memang membutuhkan sedikit perhatian untuk mencegah abstraksi bocor. Ingatlah untuk memetakan ulang scancode menjadi kode kunci saat menyajikan kunci kepada pengguna (dalam tutorial, prompt, dan dialog kustomisasi). Anda masih perlu melihat kode kunci saat mengambil input teks (misalnya, membiarkan pemain mengetik nama mereka). Jika Anda perlu menangani lebih banyak teks dari itu, lihat menggunakan dukungan input teks platform, yang berada di luar lingkup mesin game (menangani kunci mati, capslock, copy-paste, metode input lanjutan ...).

Ketika porting game yang tidak pernah menggunakan scancode (yang tidak demikian halnya dengan mesin yang layak, karena scancode juga lebih dekat dengan perangkat keras dan lebih cepat), strategi lain mungkin lebih praktis. Anda dapat memetakan scancodes keycode menggunakan fungsi SDL2 SDL_GetKeyFromScancode dan SDL_GetScancodeFromKey , atau setara platform khusus. Jika Anda juga menggunakan loop acara SDL2, fungsi-fungsi itu akan tetap akurat di seluruh sakelar tata letak. Hindari fungsi seperti GetKeyboardLayout () pada Windows; tidak ada jaminan bahwa Anda akan dapat menemukan tata letak dalam daftar yang diketahui.

Gabriel
sumber