Saya benar-benar menemukan dilema ini dengan Input Controller Xbox. Meskipun tidak persis sama, itu sangat mirip. Anda dapat mengubah kode dalam contoh saya sesuai dengan kebutuhan Anda.
Sunting: Situasi Anda akan menggunakan ini ->
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
Dan Anda dapat mempelajari cara membuat kelas input mentah melalui ->
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
Tapi .. sekarang ke algoritma super luar biasa ... tidak terlalu, tapi hei .. itu cukup keren :)
* Jadi ... kita dapat menyimpan status setiap tombol dan yang ditekan, Dirilis, dan Dimatikan !!! Kami juga dapat memeriksa Waktu Tunggu, tetapi itu memang membutuhkan pernyataan jika tunggal dan dapat memeriksa sejumlah tombol, tetapi ada beberapa aturan lihat di bawah untuk informasi ini.
Tentunya jika kita ingin memeriksa apakah ada sesuatu yang ditekan, dilepaskan, dll. Anda akan melakukan "Jika (Ini) {}", tetapi ini menunjukkan bagaimana kita bisa mendapatkan status pers dan kemudian mematikannya dari frame berikutnya sehingga Anda " ismousepressed "sebenarnya akan salah saat Anda memeriksa berikutnya.
Kode Lengkap Di Sini:
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
Bagaimana itu bekerja..
Jadi saya tidak yakin nilai yang Anda terima ketika Anda menggambarkan apakah tombol ditekan atau tidak, tetapi pada dasarnya ketika saya memuat di XInput saya mendapatkan nilai 16bit antara 0 dan 65535 ini memiliki kemungkinan 15 bit untuk "Ditekan".
Masalahnya adalah setiap kali saya memeriksa ini, itu hanya akan memberi saya informasi terkini. Saya membutuhkan cara untuk mengubah kondisi saat ini menjadi Nilai Ditekan, Dirilis, dan Tahan.
Jadi yang saya lakukan adalah sebagai berikut.
Pertama-tama kita membuat variabel "CURRENT". Setiap kali kami memeriksa data ini, kami mengatur variabel "CURRENT" ke variabel "PREVIOUS" dan kemudian menyimpan data baru ke "Current" seperti yang terlihat di sini ->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
Dengan informasi ini, inilah tempat menariknya !!
Kita sekarang dapat mencari tahu apakah Button sedang DI BAWAH!
BUTTONS_HOLD = LAST & CURRENT;
Apa yang dilakukan pada dasarnya membandingkan dua nilai dan penekanan tombol apa saja yang ditampilkan di keduanya akan tetap 1 dan semua yang lain diatur ke 0.
Yaitu (1 | 2 | 4) & (2 | 4 | 8) akan menghasilkan (2 | 4).
Sekarang kita memiliki tombol "HELD" yang mana. Kita bisa mendapatkan sisanya.
Ditekan itu sederhana .. kami mengambil status "CURRENT" kami dan menghapus semua tombol yang ditekan.
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
Dirilis adalah sama, hanya kami membandingkannya dengan status TERAKHIR kami sebagai gantinya.
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
Jadi melihat situasi yang ditekan. Jika katakanlah Saat ini kami memiliki 2 | 4 | 8 ditekan. Kami menemukan bahwa 2 | 4 tempat diadakan. Ketika kita menghapus Bit Dimiliki kita hanya tersisa 8. Ini adalah bit yang baru ditekan untuk siklus ini.
Hal yang sama dapat diterapkan untuk Dirilis. Dalam skenario ini "LAST" disetel ke 1 | 2 | 4. Jadi saat kita menghapus 2 | 4 bit. Kita dibiarkan dengan 1. Jadi tombol 1 dirilis sejak frame terakhir.
Skenario di atas mungkin merupakan situasi paling ideal yang dapat Anda tawarkan untuk perbandingan bit dan memberikan 3 level data tanpa pernyataan if atau untuk loop hanya 3 perhitungan bit cepat.
Saya juga ingin mendokumentasikan data penahanan jadi meskipun situasi saya tidak sempurna ... apa yang dilakukannya adalah pada dasarnya kami menetapkan perangkat penampung yang ingin kami periksa.
Jadi setiap kali kita mengatur data Press / Release / Hold kami memeriksa apakah data hold masih sama dengan cek bit hold saat ini. Jika tidak kita atur kembali waktunya ke waktu sekarang. Dalam kasus saya, saya mengaturnya untuk membingkai indeks jadi saya tahu berapa banyak frame yang telah ditahan.
Kelemahan dari pendekatan ini adalah saya tidak bisa mendapatkan waktu penahanan individu, tetapi Anda dapat memeriksa beberapa bit sekaligus. Yaitu jika saya mengatur bit tahan ke 1 | 16 jika salah 1 atau 16 tidak ditahan ini akan gagal. Jadi itu mengharuskan SEMUA tombol-tombol itu ditekan untuk terus berdetak.
Kemudian jika Anda melihat dalam kode Anda akan melihat semua panggilan fungsi yang rapi.
Jadi contoh Anda akan dikurangi menjadi sekadar memeriksa apakah penekanan tombol terjadi dan penekanan tombol hanya dapat terjadi sekali dengan algoritma ini. Pada pemeriksaan berikutnya untuk menekannya tidak akan ada karena Anda tidak dapat menekan lebih dari satu kali Anda harus melepaskannya sebelum Anda dapat menekan lagi.