【问题标题】:Why the texture appears only in the first quadrant为什么纹理只出现在第一象限
【发布时间】:2018-10-25 21:18:10
【问题描述】:

这段代码使用 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;
}

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

谁能告诉你怎么了?

【问题讨论】:

  • 我不知道这与问题有什么关系,无论如何我在具有 I7 处理器和 Intel 板载显卡的普通台式机上使用 Windows 8.1。

标签: c++ sfml


【解决方案1】:

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

第一个:

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

这不是真的。 SFML 使用纹理的实际大小处理 sprites。如果您的图像是 1000x1000,但您希望将其表示为 500x500,您应该将纹理分配给精灵,就像您所做的那样:

Sprite numeros(background);

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

numeros.setScale(0.5, 0.5);

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

第二个:

你弄乱了窗口的视图。如果我们检查SFML documentation,我们可以看到sf::View 期望:

  • sf::FloatRect:这是一个坐标 (x,y) - 在这种情况下是左上角 - 和一个大小(width, height)

  • 两个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;
}

我的结果:

【讨论】:

  • 感谢您在回复中的所有关注,但View camera 的存在是有原因的:我需要它,因为我会移动它,缩放它,所以这张图片只是背景的原型。所以我不能删除视图。而且我仍然无法使用视图使背景出现在屏幕上。这应该很简单......
  • 如果您需要视图,请按上述方式设置,sf::FloatRect 设置要查看的窗口部分
  • 哇,谢谢,问题一直是View camera 声明...更改为View camera (FloatRect(0, 0, window.getSize().x, window.getSize().y)); 并删除camera.setSize 行解决了问题。非常感谢!
  • 欢迎您!!我会很感激你接受这个答案。这有助于其他人知道这个问题是否得到解决。
  • 当然,我忘记了,我已经接受了答案,再次感谢。
【解决方案2】:

只是为了给@alseether 的出色响应添加另一个选项,我意识到整个问题都在于糟糕的视图初始化。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多