실제로 Xbox Controller Input에서 이러한 딜레마를 발견했습니다. 정확히 동일하지는 않지만 꽤 비슷합니다. 내 예제에서 필요에 맞게 코드를 변경할 수 있습니다.
편집 : 상황은 이것을 사용합니다->
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) {}"를 수행 할 것입니다. 그러나 이것은 프레스 상태를 얻고 다음 프레임을 끄는 방법을 보여줍니다. ismousepressed "는 다음에 확인할 때 실제로 거짓입니다.
여기에 전체 코드 :
https://github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
작동 원리
따라서 버튼을 눌렀는지 여부를 묘사 할 때받는 값을 확실하지 않지만 기본적으로 XInput에로드 할 때 0에서 65535 사이의 16 비트 값을 얻습니다.
문제는 내가 이것을 확인할 때마다 정보의 현재 상태를 알려줍니다. 현재 상태를 Pressed, Release 및 Hold Values로 변환하는 방법이 필요했습니다.
그래서 내가 한 일은 다음과 같습니다.
먼저 "CURRENT"변수를 만듭니다. 이 데이터를 확인할 때마다 "CURRENT"를 "PREVIOUS"변수로 설정 한 다음 여기에 표시된대로 "Current"에 새 데이터를 저장합니다.
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
이 정보를 통해 여기에 흥미 진진한 곳이 있습니다!
이제 Button이 HELD DOWN인지 알아낼 수 있습니다!
BUTTONS_HOLD = LAST & CURRENT;
이것이하는 것은 기본적으로 두 값을 비교하고 둘 다에 표시된 버튼 누름은 1을 유지하고 다른 모든 것은 0으로 설정됩니다.
즉 (1 | 2 | 4) 및 (2 | 4 | 8)은 (2 | 4)를 산출합니다.
이제 "HELD"버튼이 있습니다. 우리는 나머지를 얻을 수 있습니다.
누르는 것은 간단하다. 우리는 "CURRENT"상태를 취하고 누르고있는 모든 버튼을 제거한다.
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
릴리즈는 마지막 상태와 비교할 때만 동일합니다.
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
Pressed 상황을보고 있습니다. 말하자면 현재 우리는 2 | 4 | 8을 눌렀습니다. 우리는 그것을 발견 2 | 4 개최지. 보류 비트를 제거하면 8 개만 남게됩니다.이 사이클에서 새로 누른 비트입니다.
릴리스에도 동일하게 적용될 수 있습니다. 이 시나리오에서 "LAST"는 1 | 2 | 4. 따라서 2 | 4 비트 우리는 1로 남았습니다. 따라서 버튼 1은 마지막 프레임 이후에 해제되었습니다.
이 시나리오는 아마도 비트 비교를 위해 제공 할 수있는 가장 이상적인 상황 일 수 있으며 if 문이나 for 루프없이 3 개의 빠른 비트 계산으로 3 가지 수준의 데이터를 제공합니다.
또한 상황이 완벽하지는 않지만 보류 데이터를 문서화하고 싶었습니다. 수행하는 작업은 기본적으로 확인하려는 보류 비트를 설정하는 것입니다.
따라서 Press / Release / Hold 데이터를 설정할 때마다 보류 데이터가 여전히 현재 보류 비트 검사와 같은지 확인합니다. 재설정하지 않으면 시간을 현재 시간으로 재설정합니다. 필자의 경우 프레임 인덱스로 설정하여 얼마나 많은 프레임이 보류되었는지 알 수 있습니다.
이 방법의 단점은 개별 보류 시간을 얻을 수 없지만 한 번에 여러 비트를 확인할 수 있다는 것입니다. 즉, 홀드 비트를 1로 설정하면 | 1 또는 16이 유지되지 않으면 16이 실패합니다. 틱을 계속하려면 모든 버튼을 누르고 있어야합니다.
그런 다음 코드를 보면 모든 깔끔한 함수 호출이 표시됩니다.
따라서 버튼 누름이 있는지 확인하는 간단한 예제로 예제가 축소되고 버튼 누름은이 알고리즘으로 한 번만 발생할 수 있습니다. 다음에 눌렀을 때 눌렀다가 다시 놓기 전에는 더 이상 눌렀다 놓을 수 없기 때문에 존재하지 않습니다.