답변:
근본적으로, 당신은 할 수 없습니다 . 키 조합에는 주문이 필요하며 주문에는 이벤트가 필요합니다.
할 수있는 일은 각 프레임의 키 상태를 비교하고 차이점에서 사후 키업 / 키 다운 이벤트를 생성하여 폴링을 이벤트로 전환하는 것입니다. "네이티브"이벤트 시스템이 제공하는 타임 스탬프 및 기타 프레임 내 순서를 잃어 버릴 수 있기 때문에 신뢰할 수 없지만 프레임 당 하나 이상의 키를 감지하고 주문할 수 있습니다.
주문한 이벤트가 있으면 유한 상태 머신 또는 기타 도구를 사용하여 이동 목록과 일치시키고 올바른 이벤트를 실행할 수 있습니다.
한 가지 방법은 현재 및 이전 입력 상태를 저장하고 입력을 폴링 할 때마다 비교하는 것입니다.
누를 수있는 각 키에 대해 키가 마지막으로 다운 상태에서 업 상태로 전환 된 시간 소인이있는 오브젝트를 저장하십시오.
모든 폴에서이를 수행하여 이러한 오브젝트를 업데이트하십시오.
void update(){
some_key_has_been_pressed = false;
foreach(key in keys){
if(previous_input[key].Down && current_input[key].Up){
keys[key].up_timestamp = current_time();
}
if(current_input[key].Down){
keys[key].down_timestamp = current_time();
some_key_has_been_pressed = true;
}
}
}
이제 콤보를 패턴의 내용과 일치시킬 수 있습니다. keys
.
각 콤보마다 콤보 객체를 만들고 각 폴에서 각 콤보 객체에 대해 update ()를 호출하십시오.
콤보 객체의 update () 메소드는 콤보와 패턴 일치하여 콤보에 필요한 모든 조건이이 폴에서 충족되는지 확인합니다. 즉, 지금까지 콤보에 대한 모든 키 타임 스탬프가 순서대로 있으며 콤보를 깨는 다른 키는이 프레임에서 눌리지 않았습니다. 충족 된 각 조건에 대해 콤보 개체의 카운터를 다음 조건으로 증가시켜 확인하십시오. 콤보에서 모든 조건이 충족되면 콤보가 수행해야하는 메소드를 호출하십시오. 경우 some_key_has_been_pressed == true
만 콤보에 대한 다음 조건 키를 누를되지 않은, 다음 0으로 콤보의 만족 상태 카운터를 재설정합니다.
위의 방법은 구현하기 쉽고 유지 관리가 쉽고 효율적이며 모듈성이 높기 때문에 선호하는 방법입니다.
그러나 다른 좋은 방법 은 C #으로 작성된 XNA 입력 시퀀스 샘플을 확인 하고 논리는 사용중인 언어로 전송할 수 있습니다.
if(current_input[key].down){
에서 키가 previous_input
상태 에 있는지 확인하고 싶지 않습니까? 서면으로, 개최 키를 지속적으로 업데이트 할 것이라고 생각합니다 down_timestamp
.
마지막 X 키 이벤트를 스택으로 만들고, 각 키 이벤트에 대해 키 / 시간의 키와 시간이있는 객체를 추가 한 다음 스택의 마지막 멤버가 특수 패턴과 일치하는지, 해당 키가 충분히 빠르게 눌 렸는지 확인하십시오. 조합으로 계산합니다. 마지막으로 스택에서 가장 오래된 개체를 제거하십시오.