Я насправді натрапив на цю дилему з введенням контролера Xbox. Хоча НЕ ТОЧНО те саме, це досить чортово схоже. Ви можете змінити код у моєму прикладі відповідно до ваших потреб.
Редагувати: Ваша ситуація використовує це ->
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
І ви можете дізнатися, як створити необроблений клас введення через ->
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
Але .. тепер на супер дивовижний алгоритм ... не дуже, але ей .. це дуже круто :)
* Отже ... ми можемо зберігати стани кожної кнопки, які натиснуті, випущені та затримані !!! Ми також можемо перевірити час утримування, але для цього потрібна одинарна операція if і може перевірити будь-яку кількість кнопок, але деякі правила див. Нижче для цієї інформації.
Очевидно, якщо ми хочемо перевірити, чи щось натиснуто, відпущено тощо. Ви зробите "If (This) {}", але це показує, як ми можемо отримати стан друку, а потім вимкнути його з наступного кадру, щоб ваш " ismousepress "насправді буде помилковим наступного разу, коли ви перевірите.
Повний код тут:
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
Як це працює..
Тому я не впевнений, що значення, які ви отримуєте при зображенні, натиснута чи ні кнопка, але в основному, коли я завантажуюся в XInput, я отримую 16-бітне значення між 0 і 65535, це має 15 біт можливих станів для "Пресовано".
Проблема була щоразу, коли я перевіряв це, просто дав би мені поточний стан інформації. Мені знадобився спосіб перетворити поточний стан у значення "Пресовані", "Випущені" та "Утримувані".
Тому я зробив наступне.
Спочатку ми створюємо змінну "СУЧАСНА". Кожен раз, коли ми перевіряємо ці дані, ми встановлюємо "СУЧАСНІ" на змінну "ПОПЕРЕДНЯ", а потім зберігаємо нові дані в "Поточні", як показано тут ->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
З цією інформацією ось де це стає захоплюючим !!
Тепер ми можемо з'ясувати, чи кнопка ведеться вниз!
BUTTONS_HOLD = LAST & CURRENT;
Це, в основному, це порівняння двох значень і будь-яке натискання кнопки, яке показане в обох, буде 1 і все інше встановлено на 0.
Тобто (1 | 2 | 4) & (2 | 4 | 8) вийде (2 | 4).
Тепер, коли ми маємо, які кнопки "ДОПОМОЖЕНІ" вниз. Решту ми можемо отримати.
Натискання просте. Ми приймаємо стан "СУЧАСНО" і видаляємо всі утримувані кнопки.
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
Випущений - це те саме, що ми порівняємо його з НАЙ ОСТАННІм станом.
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
Тож дивлячись на ситуацію з пресованістю. Скажімо, на даний момент у нас було 2 | 4 | 8 натиснуті. Ми виявили, що 2 | 4, де проводиться. Коли ми видаляємо Held Bits, у нас залишається лише 8. Це нещодавно натиснутий біт для цього циклу.
Те саме можна застосувати і до випуску. У цьому сценарії "LAST" було встановлено на 1 | 2 | 4. Отже, коли ми видаляємо 2 | 4 біти. Нам залишається 1. Отже, кнопка 1 була відпущена з останнього кадру.
Наведений вище сценарій, мабуть, є найбільш ідеальною ситуацією, яку ви можете запропонувати для порівняння бітів, і він пропонує 3 рівні даних, без операторів, а для циклів - лише 3 швидкі розрядні обчислення.
Я також хотів задокументувати дані про затримку, тому хоча моя ситуація не є ідеальною ... що це робиться, ми в основному встановлюємо хобі, які ми хочемо перевірити.
Таким чином, кожного разу, коли ми встановлюємо наші дані про прес / реліз / утримування, ми перевіряємо, чи дані утримування досі дорівнюють поточній біті перевірки. Якщо це не так, ми скидаємо час до поточного часу. У моєму випадку я встановлюю його на індекси кадру, тому я знаю, скільки кадрів утримується.
Мінусом цього підходу є те, що я не можу отримати окремі рази утримування, але ви можете перевірити кілька бітів одночасно. Тобто, якщо я встановив біт утримування на 1 | 16 якщо 1 або 16 не відбудеться, це не вдасться. Тому потрібно продовжити натискання УСІХ цих кнопок.
Тоді якщо ви заглянете в код, ви побачите всі акуратні дзвінки функції.
Тож ваш приклад зводиться до простої перевірки, чи відбулося натискання кнопки та натискання кнопки може відбутися лише один раз за допомогою цього алгоритму. Під час наступної перевірки натиснути її не буде, оскільки ви не можете натиснути більше, як тільки вам доведеться відпустити, перш ніж ви зможете натиснути ще раз.