【问题标题】:SFML Views setCenter vs rotationSFML 视图 setCenter 与旋转
【发布时间】:2018-04-26 04:31:52
【问题描述】:

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

我申请view.zoom(2) 将视图保留为一半大小。

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

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

如您所见,旋转轴的中心应为 0.0,但不被尊重。 问题是如果我做view.setCenter (0,0),整个视图会回到原来窗口的中间。

如何解决?

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这是错误的。与 view.setCenter(500,300) 类似的是 view.move(500/2,300/2) 以获得左上角;但是在执行 SetCenter (0,0) 之后,它的整个视图又回到了屏幕的中心。
    • 您的建议均无效。您是否创建了一些来模拟这个?问题是“setCenter”移动了对象,而“move”改变了中心。也就是说,一个取消另一个。你能告诉我解决方案吗?
    • @RogérioDec 然后我会尝试setRotation(float angle) 而不是rotate。如果这也不起作用,我会尝试reset(const FloatRect& rectangle),首先创建一个具有所需视图的位置和旋转的矩形,然后创建视图并将其重置为该矩形。
    【解决方案2】:

    此代码由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;
    }
    

    【讨论】:

      【解决方案3】:

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

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

      取目标点(在视图坐标系中)和视图中心之间的差值,然后将该点旋转您希望旋转视图的量并围绕视图中心旋转。然后,计算这些点(目标点和旋转点)之间的差异。一旦有了这种差异,只需旋转视图(正常围绕其中心),然后按该差异移动视图。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        相关资源
        最近更新 更多