Почему текстура появляется только в первом квадранте - PullRequest
0 голосов
/ 16 мая 2018

Что не так с этим кодом с использованием SFML?

В приведенном ниже коде у меня есть это изображение (1000x1000), и я хочу показать его в окне (500x500) с помощью sf:: RenderTexture.Однако в первом квадранте появляется только часть изображения:

#include <SFML/Graphics.hpp>
using namespace sf;

int main()
{
    RenderWindow window({500, 500}, "SFML Views", Style::Close);

    View camera;
    camera.setSize(Vector2f(window.getSize()));

    Texture background;
    background.loadFromFile("numeros.png");
    Sprite numeros (background);

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

    Sprite content;
    content.setTexture(texture.getTexture());

    texture.draw(numeros);
    texture.display();

    while (window.isOpen())
    {
        for (Event event; window.pollEvent(event);)
            if (event.type == Event::Closed)
                window.close();
        window.clear();
        window.setView(camera);
        window.draw(content);
        window.display();
    }
    return EXIT_SUCCESS;
}

enter image description here

Насколько я понимаю, код должен генерировать оригинализображение (1000x1000) автоматически настраивается на 500x500.

Может кто-нибудь сказать вам, что не так?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Просто чтобы добавить еще один вариант к отличному ответу @alseether, я понял, что вся проблема заключалась в плохой инициализации View.

Таким образом, вы также можете установить размер вида = для размера фонового изображения (1000, 1000) и, наконец, установить центр вида в верхнем левом углу окна.,

Поскольку представление больше размера окна (500 500), оно будет автоматически настроено на этот новый размер.

Короче говоря, изменяемый раздел будет иметь вид:

View camera;
camera.setSize(Vector2f(background.getSize().x, background.getSize().y));
camera.setCenter(Vector2f(window.getSize()));
0 голосов
/ 16 мая 2018

На самом деле вы сталкиваетесь с двумя различными проблемами:

Первая:

Насколько я понимаю, код должен генерировать исходное изображение (1000x1000)автоматически настраивается на 500x500.

Это не совсем так.SFML обрабатывает спрайтов с реальным размером текстуры.Если ваше изображение 1000x1000, но вы хотите представить его как 500x500, вы должны назначить текстуру спрайту, как вы это делаете:

Sprite numeros(background);

, а затем масштаб этот спрайт для размещения в окне 500x500, это:

numeros.setScale(0.5, 0.5);

С этим изменением вы должны просмотреть все изображение, но ...

Второй:

Ты балуешься с видом окна.Если мы проверим документацию SFML , мы увидим, что sf::View ожидает:

  • A sf::FloatRect: это координата (x, y) - в данном случаеверхний левый угол - и размер (ширина, высота)

или

  • Два sf::Vector2f: один соответствует координатам центра а другой соответствует размеру вида.

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

Поэтому вам просто нужно удалить:

window.setView(camera);


Код, который я пробовал:

int main()
{
    RenderWindow window({ 500, 500 }, "SFML Views", Style::Close);

    View camera;
    camera.setSize(Vector2f(window.getSize()));

    Texture background;
    background.loadFromFile("numeros.png");
    Sprite numeros(background);
    numeros.setScale(0.5, 0.5);   // <-- Add this

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

    Sprite content;
    content.setTexture(texture.getTexture());

    texture.draw(numeros);
    texture.display();

    while (window.isOpen())
    {
        for (Event event; window.pollEvent(event);)
        if (event.type == Event::Closed)
            window.close();
        window.clear();
        //window.setView(camera);    <-- Remove this
        window.draw(content);
        window.display();
    }
    return EXIT_SUCCESS;
}

И мой результат:

enter image description here

...