【问题标题】:How is the texture getting destroyed in the following case?在以下情况下,纹理是如何被破坏的?
【发布时间】:2015-05-09 02:17:38
【问题描述】:

在 SFML 教程中,据说当您执行以下操作时纹理会被破坏:-

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

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

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

【问题讨论】:

  • 您需要了解构造函数、析构函数、它们的作用以及它们何时运行。在这种情况下,texture 的析构函数会在变量超出范围时执行,无论这种情况如何发生。

标签: c++ textures sprite sfml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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 对象,并且只返回一个引用或指向它的指针或一个新精灵,并且仅在以下情况下加载纹理它们还没有在内存中。

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

    【讨论】:

    • this 是一个指针,就这样使用它。还是别提了,这里也一样。 ;-)
    • 是为了强调成员变量的使用,只是最近没怎么C++,暂时忘了它是一个指针。
    猜你喜欢
    • 2021-10-04
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多