为什么纹理仅出现在第一象限中

时间:2018-05-15 23:12:59

标签: c++ sfml

使用SFML的代码有什么问题?

在下面的代码中,我有this image(1000x1000),我想使用sf :: RenderTexture在一个窗口(500x500)中显示它。 但是,只有部分图像出现在第一个象限中:

#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

据我所知,代码应生成自动调整为500x500的原始图像(1000x1000)。

有谁可以告诉你出了什么问题?

2 个答案:

答案 0 :(得分:6)

事实上,你面临着两个截然不同的问题:

第一个:

  

据我所知,代码应生成原始代码   图像(1000x1000)自动调整为500x500。

这不是真的。 SFML使用纹理的实际大小处理精灵。如果您的图像是1000x1000,但是您希望将其表示为500x500,则应将纹理指定给精灵,如下所示:

Sprite numeros(background);

然后缩放这个精灵适合500x500的窗口,这是:

numeros.setScale(0.5, 0.5);

通过此更改,您应该查看整个图像,但是......

第二个:

你弄乱了窗户的景色。如果我们检查SFML documentation,我们可以看到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

答案 1 :(得分:1)

只是为@alseether的优秀响应添加另一个选项,我意识到整个问题包括错误的View初始化。

这样你也可以将视图的大小设置为背景图像的大小(1000,1000),最后将视图的中心设置为窗口的左上角。

由于视图大于窗口大小(500,500),它将自动调整为这个新大小。

简而言之,要更改的部分将是:

View camera;
camera.setSize(Vector2f(background.getSize().x, background.getSize().y));
camera.setCenter(Vector2f(window.getSize()));