C++ 在以下情况下,纹理是如何被破坏的?
在SFML教程中,据说当您执行以下操作时,纹理会被破坏:-C++ 在以下情况下,纹理是如何被破坏的?,c++,textures,sprite,sfml,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 当纹理正确返回时,它是如何被破坏的?对象纹理在其作用域结束时被
sf::Sprite loadSprite(std::string filename)
{
sf::Texture texture;
texture.loadFromFile(filename);
return sf::Sprite(texture);
} // error: the texture is destroyed here
当纹理正确返回时,它是如何被破坏的?对象
纹理
在其作用域结束时被破坏的——在函数的末尾。与堆上的数据(例如,您使用new
创建的数据)相比,堆栈分配变量的情况总是如此
当你创建一个精灵时,如果你仔细观察,你实际上从不复制纹理,而只是给它一个参考。这意味着一旦纹理对象被破坏,你就会得到一个白色的精灵。是正确的,为了补充他的伟大答案,我想提供一种克服这种情况的方法
您可以使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
对象,该类只返回指向该对象或新精灵的引用或指针,并且仅当它们不在内存中时才加载纹理
我用我使用的一个旧模板做了一个要点,它是。它适用于您想要的任何类型,您只需要创建一个资源子类,但我在这里不详细介绍。您需要了解构造函数、析构函数、它们的作用以及它们的运行时间。在这种情况下,
纹理
的析构函数在变量超出范围时执行,无论发生什么情况。此
是指针,请将其作为指针使用。或者不用说,这里也一样这是为了强调使用成员变量,我只是最近没有做很多C++,暂时忘记它是指针。