C++ 为什么纹理只出现在第一个象限中
使用SFML的代码有什么问题 在下面的代码中,我有(1000x1000),我想使用sf::RenderTexture在窗口(500x500)中显示它。 但是,只有部分图像显示在第一个象限中: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;
#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
行解决了问题。非常感谢!欢迎!!我将感谢您接受答案。这有助于其他人了解此问题是否已解决。当然,我忘记了,我已经接受了答案,再次感谢。