C++ 为什么纹理只出现在第一个象限中

C++ 为什么纹理只出现在第一个象限中,c++,sfml,C++,Sfml,使用SFML的代码有什么问题 在下面的代码中,我有(1000x1000),我想使用sf::RenderTexture在窗口(500x500)中显示它。 但是,只有部分图像显示在第一个象限中: #include <SFML/Graphics.hpp> using namespace sf; int main() { RenderWindow window({500, 500}, "SFML Views", Style::Close); View camera;

使用SFML的代码有什么问题

在下面的代码中,我有(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;
}
#包括
使用名称空间sf;
int main()
{
RenderWindow窗口({500500},“SFML视图”,样式::关闭);
摄像机;
camera.setSize(Vector2f(window.getSize());
纹理背景;
loadFromFile(“numeros.png”);
精灵数字(背景);
渲染纹理;
create(window.getSize().x,window.getSize().y);
雪碧含量;
content.setTexture(texture.getTexture());
纹理。绘制(数字);
texture.display();
while(window.isOpen())
{
for(事件;window.pollEvent(事件);)
if(event.type==event::Closed)
window.close();
window.clear();
设置视图(摄像机);
窗口。绘制(内容);
window.display();
}
返回退出成功;
}

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


有人能告诉你出了什么问题吗?

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

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

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

Sprite numeros(背景)

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

numeros.setScale(0.5,0.5)

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

第二个: 你把窗户的景色弄乱了。如果我们检查,我们可以看到
sf::View
期望:

  • A
    sf::FloatRect
    :这是一个坐标(x,y)-在本例中是左上角-和一个大小(宽度、高度)

  • 两个
    sf::Vector2f
    :一个对应于中心的坐标,另一个对应于视图的大小
假设您想使用第二个参数,您缺少第一个参数,即中心坐标,但这并不是必需的。如果您只是不应用视图,则图像应显示在整个窗口中

因此,您只需删除:

window.setView(摄像机)


我尝试过的代码:

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;
}
intmain()
{
RenderWindow窗口({500500},“SFML视图”,样式::关闭);
摄像机;
camera.setSize(Vector2f(window.getSize());
纹理背景;
loadFromFile(“numeros.png”);
精灵数字(背景);

setScale(0.5,0.5);//为了给@alseether的出色响应添加另一个选项,我意识到整个问题都是由糟糕的视图初始化造成的

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

由于视图大于窗口大小(500500),它将自动调整为此新大小

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

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

我不知道这与问题有什么关系,不管怎样,我在一个普通桌面上使用的是Windows 8.1,带有I7处理器和Intel板载图形。我感谢您在回复中给予的所有关注,但是
View camera
的存在有一个原因:我需要它,因为我会移动它,缩放它,所以这张图像就是原型背景的pe。因此我无法删除视图。我仍然无法使用视图使背景显示在屏幕上。这应该很简单…如果您需要视图,请按所述进行设置,使用
sf::FloatRect
将窗口部分设置为seewo,谢谢,一直以来的问题都是
视图摄影机
declaration…更改为查看摄影机(FloatRect(0,0,window.getSize().x,window.getSize().y));
并卸下
摄像头。setSize
行解决了问题。非常感谢!欢迎!!我将感谢您接受答案。这有助于其他人了解此问题是否已解决。当然,我忘记了,我已经接受了答案,再次感谢。