为什么 SFML 加载白色方块而不是纹理?
Why does SFML load a white square instead of a texture?
我正在开发一个 class 来管理多个纹理的加载。在我这样做之前一切正常,但是当我使用我的全新 class 时,屏幕上只出现一个白色方块:
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
对象。所以 class 在 Load()
方法中进行绑定,Get
方法应该 return 引用这些纹理对象。但是出了点问题,我不知道是什么。
我只是在猜测,但是...在 AGame
构造函数中,textures
变量是一个 local 变量,它从范围并在构造函数 returns 后被破坏。 textures
或 course 的破坏意味着它包含的地图也被破坏,unique_ptr
对象也被破坏,导致 ATextureHolder::Get
返回的引用变得无效。
除非 this->player.setTexture
按值获取其参数并进行深拷贝,否则纹理将无效并且对该对象的任何使用都将导致未定义的行为。
我正在开发一个 class 来管理多个纹理的加载。在我这样做之前一切正常,但是当我使用我的全新 class 时,屏幕上只出现一个白色方块:
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
对象。所以 class 在 Load()
方法中进行绑定,Get
方法应该 return 引用这些纹理对象。但是出了点问题,我不知道是什么。
我只是在猜测,但是...在 AGame
构造函数中,textures
变量是一个 local 变量,它从范围并在构造函数 returns 后被破坏。 textures
或 course 的破坏意味着它包含的地图也被破坏,unique_ptr
对象也被破坏,导致 ATextureHolder::Get
返回的引用变得无效。
除非 this->player.setTexture
按值获取其参数并进行深拷贝,否则纹理将无效并且对该对象的任何使用都将导致未定义的行为。