簡體   English   中英

SFML紋理持有人已刪除,但仍在范圍內

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM