2016-05-16 6 views
0

Ich habe gute Arbeit (das kann wichtig sein) FPS-Kameramodul in meiner "Game Engine". Jetzt verwende ich es mit WASD und Up/Down/Links/Rechts. Ich möchte die Möglichkeit hinzufügen, die Kamera mit der Maus zu bewegen. Es ist mein Code Ich habe geschrieben:Wie man OpenGL-Kamera bewegt in SFML per Mausbewegung

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()); 
} 

Wie kann ich meine Kamera bewegen, ohne Cursor auf dem Bildschirm zu bewegen? Es funktioniert nur wenige Sekunden und die Kamera wird gesperrt (damit ich mich nicht bewegen kann, muss ich den Prozess beenden). Ich würde lieber das Ereignis der Mausbewegung und nicht der Mausposition bekommen, aber SFML unterstützt das nicht.

Antwort

1

Haben Sie versucht, einfach den Cursor zu deaktivieren, während Sie diese Eingabe zulassen?

Leere sf :: Fenster :: setMouseCursorVisible (bool sichtbar)

Some documentation

+0

Meine Frage ist nicht über Cursor Sichtbarkeit. Es handelt sich um das Problem, ein Mausereignis zu versenden. – bajos

0

Ich habe dieses Problem selbst gelöst. Hier ist Code:

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; 
    } 
}