使用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)。
有谁可以告诉你出了什么问题?
答案 0 :(得分:6)
事实上,你面临着两个截然不同的问题:
据我所知,代码应生成原始代码 图像(1000x1000)自动调整为500x500。
这不是真的。 SFML使用纹理的实际大小处理精灵。如果您的图像是1000x1000,但是您希望将其表示为500x500,则应将纹理指定给精灵,如下所示:
Sprite numeros(background);
然后缩放这个精灵适合500x500的窗口,这是:
numeros.setScale(0.5, 0.5);
通过此更改,您应该查看整个图像,但是......
你弄乱了窗户的景色。如果我们检查SFML documentation,我们可以看到sf::View
期望:
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;
}
我的结果:
答案 1 :(得分:1)
只是为@alseether的优秀响应添加另一个选项,我意识到整个问题包括错误的View初始化。
这样你也可以将视图的大小设置为背景图像的大小(1000,1000),最后将视图的中心设置为窗口的左上角。
由于视图大于窗口大小(500,500),它将自动调整为这个新大小。
简而言之,要更改的部分将是:
View camera;
camera.setSize(Vector2f(background.getSize().x, background.getSize().y));
camera.setCenter(Vector2f(window.getSize()));