SFML Просмотры setCenter против вращения - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть вид с теми же размерами исходного окна (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 голосов
/ 27 апреля 2018

Этот код, любезно предоставленный 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;
}
0 голосов
/ 28 апреля 2018

Я рад, что вы получили желаемый результат, применив видовые окна с использованием кода Geheim.

Однако, если вы не хотите использовать видовые окна для обрезки областей окна и т. Д., Вы все равно можетевращать вид вокруг определенной точки, отличной от ее центра.Вам просто нужно немного математики ...

Возьмите разницу между целевой точкой (в системе координат вида) и центром вида и поверните эту точку на величину, которую вы хотите повернуть.и вокруг центра зрения.Затем рассчитайте разницу между этими точками (целевая точка и повернутая точка).Если у вас есть это различие, просто поверните вид (вокруг его центра, как обычно), но затем переместите вид на эту разницу.

Это может показаться сложным, так что вы можете просто использовать эту бесплатную функцию, которую я сделал, чтоделает все это автоматически;это на SFML Wiki: RotateViewAt

0 голосов
/ 26 апреля 2018

Вместо использования view.setCenter(500,300); переместите его через view.move(x_offset, y_offset);.Тогда применение setCenter(...) не переопределит центр и не будет сброшено.

Я рекомендую обратиться к справке по API View для дальнейшего чтения.

Youтакже могут быть заинтересованы в void sf::View::setViewport(const FloatRect& viewport) или void sf::View::reset(const FloatRect& rectangle).

...