SFML视图setCenter vs rotation

时间:2018-04-26 04:31:52

标签: c++ sfml

我有一个与原始窗口尺寸相同的视图(500,300)

enter image description here

我应用view.zoom(2)将视图缩小一半。

enter image description here

现在视图居中。我想将视图移动到原始窗口的左上角。所以我把view.setCenter(500,300);

enter image description here

视图现在正确定位在原始窗口的上角。但现在我想旋转视图,使视图的中心位于左上角,即(0,0):view.setRotation(5);

enter image description here

如您所见,旋转轴的中心应为0.0但不受尊重。 问题是,如果我执行view.setCenter (0,0),整个视图将返回到原始窗口的中间位置。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

而不是使用view.setCenter(500,300);通过view.move(x_offset, y_offset);移动它。然后应用setCenter(...)将不会重新定义中心,也不会重置。

我建议您咨询API reference of View以便进一步阅读。

您可能也对void sf::View::setViewport(const FloatRect& viewport)void sf::View::reset(const FloatRect& rectangle)感兴趣。

答案 1 :(得分:0)

此代码由Geheim友情提供,解决了问题,并教导了一种更实用的SFML方法。

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window({500, 300}, "SFML Views", sf::Style::Close);
    window.setFramerateLimit(120);
    bool useViewPort {true};        // change this to false to see the other version

    sf::View camera {{0, 0}, static_cast<sf::Vector2f>(window.getSize())};
    if (useViewPort)
    {
        camera.setViewport({-0.5f, -0.5f, 1, 1});
        camera.rotate(5);
    }
    else
        camera.setCenter(camera.getSize());

    camera.zoom(2);
    window.setView(camera);

    sf::RectangleShape background {camera.getSize()};
    sf::RectangleShape square {{50, 50}};
    square.setFillColor(sf::Color::Red);

    sf::RenderTexture texture;
    texture.create(window.getSize().x, window.getSize().y);

    while (window.isOpen())
    {
        for (sf::Event event; window.pollEvent(event);)
            if (event.type == sf::Event::Closed)
                window.close();

        window.clear();

        if (useViewPort)
        {
            window.draw(background);
            window.draw(square);
        }
        else
        {
            texture.clear();
            texture.draw(background);
            texture.draw(square);
            texture.display();

            sf::Sprite content {texture.getTexture()};
            content.rotate(-5);     // you have to rotate in the other disquareion here, do you know why?
            window.draw(content);
        }

        window.display();
    }

    return EXIT_SUCCESS;
}

答案 2 :(得分:0)

我很高兴您通过使用Geheim的代码应用视口来获得您想要的结果。

但是,如果您不想使用视口来剪切窗口区域等,您仍然可以围绕中心以外的特定点旋转视图。你只需要一点点数学......

取目标点(在视图的坐标系统中)与视图中心之间的不同,并将该点旋转您想要旋转视图的量以及视图的中心周围。然后,计算这些点(目标点和旋转点)之间的差异。一旦你有这个差异,只需旋转视图(正常中心),然后按照差异移动视图。

这可能听起来很复杂,所以你可能只想使用我自动完成的这个免费功能;它在SFML Wiki上: RotateViewAt