为什么 SFML 加载的是白色方块而不是纹理
Why does SFML load a white square instead of a texture?
我正在研究一个管理多个纹理加载的类。在我这样做之前,一切正常,但是当我使用我的全新课程时,屏幕上只出现一个白色方块:
namespace Textures {
enum ID { Landscape, Airplane, Missile };
}
class ATextureHolder {
public:
void Load(Textures::ID id, const std::string& filename);
sf::Texture& Get(Textures::ID);
private:
std::map<Textures::ID, std::unique_ptr<sf::Texture>> texture_map;
};
void
ATextureHolder::Load(Textures::ID id, const std::string& filename) {
std::unique_ptr<sf::Texture> texture( new sf::Texture() );
texture->loadFromFile(filename.c_str());
this->texture_map.insert(std::make_pair(id, std::move(texture)));
}
sf::Texture&
ATextureHolder::Get(Textures::ID id) {
auto found = this->texture_map.find(id);
return *found->second;
}
AGame::AGame():
window( sf::VideoMode( 640, 480 ), "SFML Game" ),
player(), //player is an instance of sf::Sprite class
player_speed( 100.0 ),
time_per_frame( sf::seconds( 1.0 / 60.0 ) ) {
ATextureHolder textures;
textures.Load(Textures::Airplane, "Media/Textures/plane.png");
this->player.setTexture(textures.Get(Textures::Airplane));
this->player.setPosition(100.0, 100.0);
}
这个想法是将存储在enum ID
中的纹理名称与唯一的指针绑定,而指针又指向实际的sf::Texture
对象。因此,该类在 Load()
方法中进行绑定,Get
方法应返回对这些纹理对象的引用。但是出了点问题,我不知道是什么。
我只是在这里猜测,但是...在AGame
构造函数中,textures
变量是一个局部变量,它超出了范围,一旦构造函数返回就会被破坏。这种对textures
或路线的破坏意味着它所包含的地图也被破坏,随之而来的是unique_ptr
对象,导致ATextureHolder::Get
返回的引用变得无效。
除非this->player.setTexture
按值获取其参数并执行深层复制,否则纹理将无效,并且对该对象的任何使用都将导致未定义的行为。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- OpenGL 混合会在纹理周围创建白色边框
- 在 SFML 中不使用动态内存时显示白色纹理代替实际纹理
- 使用 FreeType 和 SDL2 渲染文本会生成白色方块而不是字符
- OpenGL GLSL 纹理函数始终返回 vec4(1,1,1,1),白色三角形
- 现代OpenGL,在对象上获得白色纹理
- D3D11:渲染(深度)到纹理会导致红色方块,正常渲染有效
- SFML雪碧白色方块
- 为什么 SFML 加载的是白色方块而不是纹理
- SFML中的白色方块,角色和纹理存储在不同的对象中
- 纹理在 opengl 中显示为白色
- stb图像加载库返回白色纹理
- 在OpenGL中绘制完全白色纹理
- OpenGL显示白色纹理
- SFML中的白色正方形,但纹理加载良好