gpt4 book ai didi

c++ - 为什么纹理只出现在第一象限

转载 作者:太空狗 更新时间:2023-10-29 20:08:59 26 4
gpt4 key购买 nike

这段代码使用 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)。

谁能告诉你哪里出了问题?

最佳答案

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

第一个:

As far as I can understand, the code should generate the originalimage (1000x1000) automatically adjusted to 500x500.

这不是真的。 SFML 处理具有真实尺寸纹理的 Sprite 。如果你的图像是 1000x1000,但你想将它表示为 500x500,你应该将纹理分配给 Sprite ,就像你做的那样:

Sprite numeros(background);

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

numeros.setScale(0.5, 0.5);

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

第二个:

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

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

  • 两个sf::Vector2f:一个对应中心的坐标,一个对应 View 的大小。

假设您想要使用第二个参数,您缺少第一个参数,即中心坐标,但这并不是真正必要的。如果您只是不应用 View ,图像应该显示在整个窗口中。

所以你只需要删除:

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;
}

我的结果:

enter image description here

关于c++ - 为什么纹理只出现在第一象限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50360369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com