在以下情况下,纹理是如何被破坏的?

How is the texture getting destroyed in the following case?

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

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

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

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

对象 texture 在其范围结束时被销毁 - 这里是函数的末尾。与堆上的数据(例如,您使用 new 创建)形成对比的是,堆栈分配变量始终如此。

创建精灵时,如果仔细观察its constructor signature, you actually never copy the texture but just give a reference to it. This means that as soon as the texture object is destroyed then you get a white sprite as explained in the tutorial

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

您可以使 sf::Texture 成为 class 的成员变量,它将在您需要的时候(游戏、场景等)保持活动状态,然后传递 sf::Sprite 个对象。

然后,代码可能如下所示:

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

    this->mTexture.loadFromFile(filename); 

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

如果您需要多个纹理(可能是这种情况),您应该有一个 class 来管理每个 sf::Texture 对象并且只有 returns 一个引用或指针到它或一个新的精灵,只有当它们不在内存中时才会加载纹理。

我用我使用的旧模板制作了一个要点,它是 TResourceManager。它适用于你想要的每一种类型,你只需要制作一个 Resource subclass 但我不会在这里详细介绍。