2014-09-04 2 views
1

나는 내 비디오 게임을 위해 스트리트 파이터 (또는 다른 격투 게임) 조합 (아래, 아래 + 오른쪽, 오른쪽 + 펀치 = 타마 켄)과 같은 입력 조합을 인식 할 수있는 함수를 만들려고합니다.
제 아이디어는 입력을 스택에 넣은 다음 조합을 인식하는 것입니다.
문제 :
게임 루프가 실행 중이고 잠시 동안 만 키를 누르면 게임에서 입력 한 X 시간을 인식합니다 (X = 사용자가 키를 누른 동안 전달 된 사이클 수). 타이머를 사용하여 입력 횟수를 제한하려고 시도했지만 좋은 해결책이 아닙니다.입력 조합을 인식하는 방법은 무엇입니까?

아이디어가 있으십니까?

+0

키가 언제 상태를 변경하고 키 다운 이벤트를 저장하는지 추적하십시오. – molbdnilo

답변

0

조합은 일련의 주요 이벤트입니다. 따라서 어떤 종류의 포인터/반복자를 시퀀스의 현재 이벤트에 넣을 수 있습니다. 그리고 나서 창에서 새로운 sf::Event을 얻으면 포인터/반복기를 업데이트합니다. 다음과 일치하지 않으면 포인터/반복자. 그렇지 않으면 증가시킵니다. 시퀀스의 마지막 이벤트에 도달하면 유효한 조합이 생깁니다. 당신이 어떤 타이머 또는 스택을 필요가 없습니다

class Combo 
{ 
    sequence events; 
    iterator it = events.begin(); 
    bool handle(event e) 
    { 
     if (e == *it) 
     { 
      if (it == events.end()) 
      { 
       it = events.begin(); 
       return true; 
      } 
      else 
      { 
       ++it; 
       return false; 
      } 
     } 
     else 
     { 
      it = events.begin(); 
      return false; 
     } 
    } 
} 

void Manager::update(event e) // or whatever class you have 
{ 
    sequence combos = ...; 
    for (c : combos) 
    { 
     if (c.handle(e)) 
     { 
      // perform combo 'c' 
     } 
    } 
} 

이 방법 : 여기

은 좀 더 명확하게 수있는 몇 가지 의사 코드입니다.

+0

좋은 생각 인 것 같습니다. 이 "매끄러운 동작은 SFML 문서에서 sf :: Keyboard로 실시간 키보드 입력을 사용해야 만 얻을 수 있습니다. sf :: Keyboard를 사용하여 문자를 이동하고 콤보 처리를 위해 sf :: Event를 사용하는 것이 맞을 수도 있다고 생각합니까? – LolloFake

+0

[이 튜토리얼] (http://www.sfml-dev.org/tutorials/2.0/window-events.php#the-keypressed-and-keyreleased-events)을 참조 할 것입니다. 그것이 의미하는 바를 오해하지 않도록주의하십시오. [Here] (https://github.com/LaurentGomila/SFML/issues/483)는 Kynnath의 의견에 대해 더 많은 통찰력을 줄 수있는 짧은 토론입니다. 어쨌든, 가장 쉬운 방법을 찾으십시오. 결과가 만족스럽지 않으면 다른 것을 시도하십시오. – Hiura

+0

음. 나는이 사실을 알지 못했다. 잘 알고 있습니다. 대단히 감사합니다. – LolloFake

관련 문제