Почему SFML загружает белый квадрат вместо текстуры?

Вопрос: Я работаю над классом, который управляет загрузкой нескольких текстур. Прежде чем я это сделал, все сработало хорошо, но когда я использую свой совершенно новый класс, на экране появляется только белый квадрат: namespace Textures { enum ID { Landscape, Airplane, Missile }; } class ATextureHolder { public: void Load(Textures::ID id, const std::string& filename); sf::Texture& Get(Textures::ID);

Вопрос:

Я работаю над классом, который управляет загрузкой нескольких текстур. Прежде чем я это сделал, все сработало хорошо, но когда я использую свой совершенно новый класс, на экране появляется только белый квадрат:

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 принимает свой аргумент по значению и делает глубокую копию, тогда текстура будет недействительной, и любое использование объекта приведет к неопределенному поведению.

Оцените статью
Добавить комментарий