2016-05-16 47 views
0

我在我的「遊戲引擎」中工作良好(這可能很重要)FPS相機模塊。現在我使用它與WASD和向上/向下/向左/向右。我想增加通過鼠標移動相機的可能性。這是我寫的代碼:如何通過鼠標移動使OpenGL相機在SFML中移動

if (event.type == sf::Event::MouseMoved) 
{ 
    static glm::vec2 lastPos; 
    glm::vec2 mousePos(event.mouseMove.x, event.mouseMove.y); 
    glm::vec2 delta(lastPos - mousePos); 
    delta *= -0.01; 
    cam->addRotation(delta); 

    sf::Vector2i center(parentWnd->getSFMLWindow()->getSize().x/2, parentWnd->getSFMLWindow()->getSize().y/2); 
    lastPos.x = center.x; 
    lastPos.y = center.y; 

    sf::Mouse::setPosition(center, *parentWnd->getSFMLWindow()); 
} 

如何在沒有光標移動屏幕的情況下移動相機?它工作幾秒鐘和攝像頭鎖定(所以我不能鼠標移動,然後我必須殺死進程)。我寧願得到鼠標移動事件而不是鼠標位置,但SFML不支持。

回答

1

您是否嘗試過在您允許此輸入時簡單地禁用光標?

無效SF ::窗口:: setMouseCursorVisible(布爾可見)

Some documentation

+0

我的問題不是關於遊標的可見性。這是關於調度鼠標事件的問題。 – bajos

0

我已經解決了這個問題我自己。這裏的代碼:

if (event.type == sf::Event::MouseMoved) { 
    static glm::vec2 lastMousePos; 
    glm::vec2 mousePos(event.mouseMove.x, event.mouseMove.y); 

    glm::vec2 deltaPos(mousePos - lastMousePos); 
    const float mouseSensitivity = 0.1f; 
    deltaPos *= mouseSensitivity; 
    deltaPos.y *= -1; 
    cam->addRotation(deltaPos); 

    sf::Window const& sfWindow = *parentWnd->getSFMLWindow(); 
    auto windowSize = sfWindow.getSize(); 

    uint32_t maxMousePosRadius = glm::min(windowSize.x, windowSize.y)/3; 
    glm::vec2 windowCenter(windowSize.x/2, windowSize.y/2); 

    if (glm::length(mousePos - windowCenter) > maxMousePosRadius) { 
     sf::Mouse::setPosition(sf::Vector2i((int)windowCenter.x, (int)windowCenter.y), sfWindow); 
     lastMousePos = windowCenter; 
    } 
    else { 
     lastMousePos = mousePos; 
    } 
}