2016-06-05 4 views
2


일부 단위 테스트 방법을 쓰려고합니다. 키를 눌렀거나 놓았는지 확인하는 메서드를 테스트하고 싶습니다. 그리고 내 질문은 다음과 같습니다.SFML/C++ 사용자 입력 시뮬레이션

C++의 SFML에서는 키보드의 임의 키 누르기를 시뮬레이션 할 수 있습니까?

아니면이 작품이 자신을 신뢰해야합니까?

+0

내가 투표하려면 무엇을 알아야할까요? –

+0

누군가가 질문을 너무 광범위하게 생각하기 때문에 투표했습니다.하지만 여기서는 그렇지 않습니다. 특정 도서관에 대해 묻고 있습니다. – coyotte508

+0

귀하의 질문에 관해서는 http://en.sfml-dev.org/forums/index.php?topic=14611.0 일부 답변 (전 세계를 시뮬레이션 할 수 없음) – coyotte508

답변

2

내부 구조에없는, 그러나 당신이 찾고 있다면 시뮬레이션 및 KeyPressed 또는의 keyReleased 이벤트 내가 다음과 같은 작업을해야 확실 해요 당신에게 내 자신의 코드의 원인을 제공 :

const sf::Event simulateKeypress(sf::Keyboard::Key key, bool alt, bool control, bool shift, bool system) 
{ 
    sf::Event::KeyEvent data; 
    data.code = key; 
    data.alt = alt; 
    data.control = control; 
    data.shift = shift; 
    data.system = system; 

    sf::Event event; 
    event.type = sf::Event::KeyPressed; 
    event.key = data; 
    return event; 
} 

//your handler here 
handleEvent(simulateKeypress(sf::Keyboard::Key::A, false, false, false, false)); 

지금 테스트 할 수 없습니다 ... 작동한다면 다른 이벤트와 유사한 기능을 수행 할 수 있어야합니다.

+0

당신이 방금 내 문제를 해결했다고 생각합니다 .D 감사합니다, 정말로 도움이됩니다. :) –

+0

@JakubStasiak 듣기 좋았습니다! 나는 그것이 올바른 코드를 가져 가라. 행운을 빈다. – Conduit

1

직접 키 관리자를 사용할 수 있습니다. SDL (그러나 SFML와 C++에서의 동일, 변경 단지 몇 명)와 C의 예 : C++ SFML의 키 매니저를 찾았 :

typedef struct 
    { 
     char key[SDLK_LAST]; 
     int mousex,mousey; 
     int mousexrel,mouseyrel; 
     char mousebuttons[8]; 
      char quit; 
    } Input; 


void UpdateEvents(Input* in) 
{ 
    SDL_Event event; 
    while(SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
     case SDL_KEYDOWN: 
      in->key[event.key.keysym.sym]=1; 
      break; 
     case SDL_KEYUP: 
      in->key[event.key.keysym.sym]=0; 
      break; 
     case SDL_MOUSEMOTION: 
      in->mousex=event.motion.x; 
      in->mousey=event.motion.y; 
      in->mousexrel=event.motion.xrel; 
      in->mouseyrel=event.motion.yrel; 
      break; 
     case SDL_MOUSEBUTTONDOWN: 
      in->mousebuttons[event.button.button]=1; 
      break; 
     case SDL_MOUSEBUTTONUP: 
      in->mousebuttons[event.button.button]=0; 
      break; 
     case SDL_QUIT: 
      in->quit = 1; 
      break; 
     default: 
      break; 
     } 
    } 
} 

int main() 
{ 
    Input in; 

    memset(&in,0,sizeof(in)); 
    while(!in.key[SDLK_ESCAPE] && !in.quit) 
    { 
     UpdateEvents(&in); 
     if (in.mousebuttons[SDL_BUTTON_LEFT]) 
     { 
      in.mousebuttons[SDL_BUTTON_LEFT] = 0; 

     }  

     if (in.key[SDLK_UP] && in.key[SDLK_LEFT]) 
       { 

       } 

    } 
    return 0; 
} 

편집 https://github.com/dabbertorres/SwiftInputManager

은 할 수 없습니다 코드가 시뮬레이션을 어렵게 만들 것 sf::Keyboard::isKeyPressed의 영어

관련 문제