在以下情况下,纹理是如何被破坏的?
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 但我不会在这里详细介绍。
在 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 但我不会在这里详细介绍。