[英]SFML texture holder deleted although still in scope
所以我是SFML的新手。 我讀了很多文章,但我確實聽不懂。 我寫了一個紋理支架:
class tile_texture_holder {
private:
sf::Texture tx;
public:
tile_texture_holder(type a) {
switch (a) {
case type::desert:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/desert.png");
break;
case type::grass:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/grass.png");
break;
case type::mountain:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/mountain.png");
break;
case type::water:
tx.loadFromFile("C:/Users/Andreas/source/repos/conquer/Media/water.png");
break;
}
}
sf::Texture ret_texture() {
return tx;
}
~tile_texture_holder() {
std::cout << "///////////////////////HOLDER DELETED!!!/////////////////////" << std::endl;
}
};
我試圖以不同的方式加載精靈。
例如:
tile_texture_holder t(type::desert);
sf::Sprite s;
s.setTexture(t.ret_texture());
(在相同的函數中,我繪制精靈)
我總是畫白框。 而且我真的不明白為什么texture_holder被刪除。
BTW類型是一個枚舉。
希望有人可以幫助我解決我的問題!
s.setTexture(t.ret_texture());
在上面的行中,您的行為不確定。
ret_texture
返回臨時紋理(按值返回,因此會生成一個副本), setTexture
進行引用,然后在表達式末尾銷毀臨時紋理,並且在s
有懸掛的引用。
為什么會這樣? 由於Sprite
setTexture
僅保留對紋理的引用,因此不會復制它。
根據SFML Sprite參考 :
Texture參數是指只要精靈使用它就必須存在的紋理。 實際上,精靈不會存儲紋理的副本,而是保留指向您傳遞給該函數的指針的指針。
解決方案: ret_texture
應該通過引用返回紋理。
sf::Texture& ret_texture() {
return tx;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.