2016-05-16 13 views
0

"Game Engine"の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(BOOL見える)

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; 
    } 
} 
関連する問題