2015-07-13 10 views
0

我正在使用SFML進行基本的分組遊戲以熟悉C++(從C向上移動)。在遊戲循環中,我已經放置了一個導致switch語句的事件輪詢。當鼠標移動時,開關的情況下將檢索鼠標XY變化,並相應地移動擋板,像這樣:使用sfml重置開關盒中的鼠標位置時出現問題

while (window.isOpen()) 
{ 
    while (window.pollEvent(event)) 
    { 
     switch (event.type) 
     { 
      case sf::Event::Closed: 
       window.close(); 
       break; 
      case sf::Event::KeyPressed: 
       switch (event.key.code) 
       { 
        case sf::Keyboard::Escape: 
         window.close(); 
         break; 
       } 
       break; 
      case sf::Event::MouseMoved: 
       paddle.move(sf::Vector2f((sf::Mouse::getPosition(window).x - windowOffset.x) * sensitivity, 0)); 
       break; 
     } 
    } 
    sf::Mouse::setPosition(windowOffset, window); 
    window.clear(); 
    window.draw(paddle); 
    window.display(); 
} 

現在,工作得非常愉快,我重新設置鼠標位置在的每個循環的窗口中心,如果鼠標沒有移動,這不是必需的。所以,我想移動sf::Mouse::setPosition()進入switch語句,下面paddle.move,就像這樣:

case sf::Event::MouseMoved: 
    paddle.move(sf::Vector2f((sf::Mouse::getPosition(window).x - windowOffset.x) * sensitivity, 0)); 
    sf::Mouse::setPosition(windowOffset, window); 
    break; 

然而,當我重建項目,我現在得到一個空白窗口。 所以,我的問題是:這是怎麼回事?

編輯(最小的完整代碼)

int WinMain() 
{ 
    sf::Vector2i windowRes(700, 900); 
    sf::Vector2i windowOffset(350, 450); 
    sf::ContextSettings settings; 
    sf::RectangleShape paddle; 
    paddle.setSize(sf::Vector2f(150, 20)); 
    paddle.setOrigin(350, 0); 
    paddle.setPosition(350, 825); 
    sf::RenderWindow window(sf::VideoMode(windowRes.x, windowRes.y), "Breakout", sf::Style::Default, settings); 
    window.setMouseCursorVisible(false); 
    sf::Mouse::setPosition(windowOffset, window); 
    sf::Event event; 
    while (window.isOpen()) 
    { 
     while (window.pollEvent(event)) 
     { 
      switch (event.type) 
      { 
      case sf::Event::Closed: 
       window.close(); 
       break; 
      case sf::Event::KeyPressed: 
       switch (event.key.code) 
       { 
       case sf::Keyboard::Escape: 
        window.close(); 
        break; 
       } 
       break; 
      case sf::Event::MouseMoved: 
       paddle.move(sf::Vector2f((sf::Mouse::getPosition(window).x - windowOffset.x), 0)); 
       //sf::Mouse::setPosition(windowOffset, window); 
       break; 
      } 
     } 
     sf::Mouse::setPosition(windowOffset, window); 
     window.clear(); 
     window.draw(paddle); 
     window.display(); 
    } 
    return 0; 
} 
+0

聽起來像你使用錯誤的配置。你是否在發佈模式或其他方式鏈接調試庫? – Lukas

+0

@Lukas我只是雙重檢查,這似乎並不是問題。我已經靜態鏈接了所有的sfml庫文件,用於發佈_and_調試,並且也在調試模式下構建。此外,如果我將'sf :: Mouse :: setPosition()'移出交換機,則問題將得到解決,然後完成項目的重建。無論發生什麼_appears_直接關聯到切換案例中'sf :: Mouse :: setPosition()'的位置。不過謝謝你的迴應! –

+0

當代碼根據某些代碼行的位置而有所不同時,它通常是一些堆或配置問題。我敢肯定,如果你提供了一個完整的,最小的例子,它將在我的系統上運行得很好。 – Lukas

回答

0

所以,通過一些修修補補,似乎sf::MOUSE::setposition()產生的sf::Event::MouseMovedevent.type,這將被添加到事件隊列,導致一個無限循環。