2016-12-28 6 views
0

C++의 많은 멀티미디어 라이브러리에는 키보드 상태를 감지하는 기능이 있습니다. 그러나 이러한 기능은 키가 보유되어 있는지 감지하고 상수 신호를 전송하기 때문에 결함이 있습니다. 이 기능을 켜고 신호를 한 펄스 보내려면 키를 누른 경우에만 누르고, 누른 후에는 신호를 보내고 싶습니다.라이브러리의 "isKeyPressed"기능을 "keyPressedOnce"로 바꾸시겠습니까?

내가 (의사의)이 같은 짓을 : 그것이 작동하는 경우에도 "하면서"루프가 작동하는 동안, 다른 키를 테스트하는 것은 불가능하기 때문이 아니라 효과가

while isKeyPressed { if not isKeyPressed (exit_loop) } 

및 또한 키가 유지되는 시간에 대한 프로그램을 지연시킵니다.

누구나 더 나은 옵션을 생각할 수 있습니까?

(필자는 SFML의 기능 sf::Keyboard::isKeyPressed()을 사용했습니다).

+0

프로그램에 단일 폴링 루프가 있고 이전 키 상태와 함께 클래스 안에 래핑하십시오. 콜백을 등록하도록 할 수 있습니다 ... – LogicStuff

+0

어떻게하면 더 정확하게 할 수 있습니까? – KKZiomek

답변

1

일부 라이브러리가 제대로 작동하지 않기 때문에 원하는대로 작동하지 않아 결함이 발생하지 않습니다. 이것은 의도적 일 수 있습니다 (이 경우).

SFML는 당신에게 키보드 입력을 얻기에 두 개의 서로 다른 접근 방식 제공 (세, 당신은 sf::Event::TextEntered 이벤트 다른 접근 방식을 고려하는 경우) : 키를 누를 여부를 결정하기 위해

  • 당신은 직접 키보드 상태를 확인 할 수 있습니다 .
  • 윈도우의 이벤트 대기열을 확인하여 키를 눌렀거나 놓는 것을 감지 할 수 있습니다.

    sf::Event event 
    while (window.pollEvent(event) { 
        switch (event.type) { 
         case sf::Event::KeyPressed: 
          std::cout << "down: " << event.key.code << std::endl; 
          break; 
         case sf::Event::KeyReleased: 
          std::cout << "up: " << event.key.code << std::endl; 
          break; 
         // Don't forget to check for other events here 
        } 
    } 
    

    를 누르면 일단 당신이 이러한 이벤트는 의지 만 불을 알 수 있습니다 또는 (버튼에서 손을 떼면 : 당신이 첫 번째 방법을 사용하는 동안

, 당신은 실제로 두 번째 사용할 것 이 동작을 변경하려면 sf::Window::setKeyRepeatEnabled()을 사용하지 않는 한) 원하는 것을 정확하게 찾을 수 있습니다.