在SFML教程中,据说当你做这样的事情时,纹理会被破坏: -
sf::Sprite loadSprite(std::string filename)
{
sf::Texture texture;
texture.loadFromFile(filename);
return sf::Sprite(texture);
} // error: the texture is destroyed here
当纹理正确返回时,纹理是如何被破坏的?
答案 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子类,但我不会在这里了解详细信息。