在下列情况下,纹理如何被破坏?

时间:2015-05-09 02:17:39

标签: c++ textures sprite sfml

在SFML教程中,据说当你做这样的事情时,纹理会被破坏: -

sf::Sprite loadSprite(std::string filename) 
{ 
    sf::Texture texture; 
    texture.loadFromFile(filename); 

    return sf::Sprite(texture); 
} // error: the texture is destroyed here 

当纹理正确返回时,纹理是如何被破坏的?

2 个答案:

答案 0 :(得分:2)

对象texture在其范围结束时被销毁 - 这是在函数的末尾。对于堆栈分配的变量,情况总是如此,与堆上的数据(例如,您使用new创建)相反。

当你创建一个精灵时,如果仔细观察its constructor signature,你实际上从不复制纹理,只是给它一个 引用 。这意味着一旦纹理对象被破坏,你就会得到一个白色精灵as explained in the tutorial

答案 1 :(得分:1)

Hiura是正确的,只是为了补充他的好答案,我想提供一种方法来克服这种情况。

你可以让sf::Texture成为一个类的成员变量,它将在你需要它的时候(游戏,场景等)保持活着,然后传递sf::Sprite个对象。

然后,代码看起来像这样:

sf::Sprite loadSprite(std::string filename) 
{ 

    this->mTexture.loadFromFile(filename); 

    // then only make copy of the sprite object
    return sf::Sprite(texture); 
}

如果你需要多个纹理(可能就是这种情况),你应该有一个管理每个sf::Texture对象的类,它只返回一个引用或指向它的指针或一个新的sprite,它会加载纹理只有当他们还没有记忆时。

我用我使用过的旧模板制作了一个要点,它是TResourceManager。它适用于您想要的每种类型,您只需要创建一个Resource子类,但我不会在这里了解详细信息。