2012-11-15 24 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(); 
    } 
    

    在此代碼,整個過程被分成兩個部分

  • 我們首先攔截用戶輸入,看看是否需要改變事物的移動狀態。
  • 然後,一旦每個事件都被捕獲並徹底分析,我們就將它移動到必要的位置。它是通過兩個布爾(你可能需要增加到四個,如果你想要四個方向的控制,如果你想處理對角線方向,使用枚舉比使用八個布爾更明智,這開始是內存 - 爲這樣一個簡單的任務。)

注意:您可能會注意到,我將「速度」更改爲「SPEED」。我看不出它是一個定義,一個常量變量還是簡單的var代碼,但最好的選擇將是兩個第一個之一。我更喜歡使用#define來處理這些事情,使常量容易到達(因爲它們被放置在預處理器中),並且完全封閉的文字使它在代碼中與經典變量更加可區分。但這只是我們在這裏談論的編碼風格:)