Держатель текстур SFML удален, хотя все еще находится в области видимости - PullRequest
0 голосов
/ 13 июня 2019

Так что я новичок в 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());

(в той же функции, где я рисую спрайт)

Я всегда получаю белую коробку. И я действительно не понимаю, почему текстурный держатель удаляется.

Кстати, тип enum.

Надеюсь, кто-нибудь поможет мне решить мою проблему!

1 Ответ

1 голос
/ 13 июня 2019
s.setTexture(t.ret_texture());

в строке выше у вас есть неопределенное поведение.

ret_texture возвращает временную текстуру (она возвращается по значению, поэтому создается копия), setTexture принимает ссылку на нее, затем в конце выражения временная текстура уничтожается, и в s появляется свисающая ссылка .

Почему это происходит? Поскольку setTexture из Sprite содержит только ссылку на текстуру, она не копирует ее.

Согласно справке SFML Sprite :

Аргумент текстуры относится к текстуре, которая должна существовать до тех пор, пока спрайт использует это. Действительно, спрайт не хранит свою собственную копию текстура, а скорее держит указатель на тот, который вы передали эта функция.

Решение: ret_texture должно возвращать текстуру по ссылке.

sf::Texture& ret_texture() {
    return tx;
}
...