2012-11-15 5 views
0

화살표 키를 사용하여 캐릭터를 제어해야하는 2D 게임을 만들고 있습니다.SFML 입력 시작시 반응이 없습니다

 if((win.GetInput().IsKeyDown(sf::Key::Down))) 
     { 
      y = y + Speed; 
     } 

     if((win.GetInput().IsKeyDown(sf::Key::Left))) 
     { 
      x = x - Speed; 
     } 

나는 10에 속도를 설정 한 후, 나는 실제로 내 캐릭터를 애니메이션하기 위해 Sprite.SetPosition (X, Y)를 사용합니다.

모두 정상적으로 작동합니다. 그러나 문제는 화살표 키를 누를 때마다 문자가 1/2 초 동안 움직이며 약 1/2 초 동안 멈추고 부드럽게 움직이면됩니다. 이것은 화살표 키를 누를 때마다 발생합니다.

그리고 네, 여러 이벤트를 동시에 처리하기 위해 while 루프를 사용하고 있습니다.

제 질문이 충분히 분명하기를 바랍니다. 제발 도와주세요!

감사합니다.

답변

3

나는 당신이 올바른 방법으로 이벤트를 처리하지 않는다고 생각합니다. 여기에서는 sf :: Key :: Down 키가 눌려 졌는지 (그리고 sf :: Key :: Left에서도 마찬가지) 각 이벤트 (키보드 입력 일 수 있는지 여부)를 확인합니다.

첫째, 효과가 없습니다. 원하는 결과를 얻지 못하기 때문입니다. 둘째, 이벤트가 마우스 이동, 마우스 클릭 또는 기타 일 수 있음을 인정하는 쓸데없는 검사를 수행합니다. 이러한 경우 키가 눌려 졌는지 여부를 확인하는 것은 프로그램에 무의미합니다.

나는 전체 코드를 볼 수는 없지만, 당신이 당신의 메인 루프로이 맛의 무언가를 시도해야합니다 :

    :이 코드에서

    bool isMovingLeft = false; 
    bool isMovingDown = false; 
    sf::Event event; 
    
    while (win.IsOpen()) 
    { 
        // While window catches events... 
        while(win.GetEvent(event)) 
        { 
         // If the caught event is a click on the close button, close the window 
         if (event.Type == sf::Event::Closed) 
          win.Close(); 
         // If it's a key press, check which key and move consequently 
         else if (event.Type == sf::Event::KeyPressed) 
         { 
           if(event.Key.Code == sf::Key::Left) 
            isMovingLeft = true; 
           else if(event.Key.Code == sf::Key::Down) 
            isMovingDown = true; 
         } 
         // If it's a key release, stop moving in the following direction 
         else if (event.Type == sf::Event::KeyReleased) 
         { 
           if(event.Key.Code == sf::Key::Left) 
            isMovingLeft = false; 
           else if(event.Key.Code == sf::Key::Down) 
            isMovingDown = false; 
         }  
        } 
    
        // Now that we have caught events, we move the lil' thing if we need to. 
        if(isMovingLeft) 
          x = x - SPEED; 
        if(isMovingDown) 
          y = y - SPEED; 
    
    
        win.Clear(); 
    
        // Draw things on the screen... 
    
        win.Display(); 
    } 
    

    , 전체 프로세스는 두 부분으로 분할

  • 먼저 사용자 입력을 가로 채서 물건의 이동 상태를 변경해야하는지 확인합니다.
  • 그런 다음 모든 이벤트가 잡히고 철저히 분석되면 이벤트를 이동해야합니다. 두 개의 bool을 통해 수행됩니다 (4 방향 컨트롤을 원할 경우 4로 증가해야 할 수도 있습니다). 대각선 방향을 처리하려면 8 개의 bool보다 enum을 사용하는 것이 현명합니다. - 간단한 작업을 위해 사용함)

참고 : "Speed"를 "SPEED"로 변경했을 수 있습니다. 그것이 정의, const var 또는 단순히 당신이 주어진 코드에서 볼 수는 없지만 최선의 선택은 두 가지 중 하나가 될 것입니다. 나는 그런 것들을 위해 #define을 사용하여 상수를 쉽게 접근 할 수있게하고 (전처리기에 넣음) 코드에 한 번만 달아서 고전적인 vars와 차별화되도록하는 것이 더 낫다. 그러나 그것은 우리가 여기서 말하는 코딩 스타일 일뿐입니다.

관련 문제