纹理正在被删除?

问题描述 投票:0回答:1
// Sprite.
if(ImGui::CollapsingHeader("Sprite.")) {
    // Preview texture allocations.
    sf::Texture texture;

    // ...

    static char spritePath[MAX_OBJECTS_TEXT_SIZE / 2]; // (512 / 2)

    // ...

    if(ImGui::InputText("Sprite path.##sprite", spritePath, IM_ARRAYSIZE(spritePath))) {
        texture.loadFromFile(spritePath);
    }

    // ...

    // Preview. (150, 150).
    ImGui::Image(texture, sf::Vector2f(DEFAULT_TEXTURE_PREVIEW_WIDTH, DEFAULT_TEXTURE_PREVIEW_HEIGHT), sf::Color::Transparent, sf::Color::White);
}

结果: image

example.png - 完全存在并且没有错误(无法加载纹理)。

来自 SFML 文档 -

您已成功加载纹理,正确构建精灵,并且...现在您在屏幕上看到的只是一个白色方块。发生了什么?

这是一个常见的错误。当您设置精灵纹理时,它在内部所做的只是存储指向纹理实例的指针。因此,如果纹理被破坏或移动到内存中的另一个位置,精灵最终会得到无效的纹理指针。

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

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

` 我不明白为什么如果我在一个 if 块中创建纹理会被破坏,以及如何使其不被破坏?

P.S: ImGui::Image 函数 - 在下一帧中绘制图像,并在下一帧中删除纹理,如何使纹理具有无限生命周期?

c++ sfml imgui
1个回答
0
投票

当你这样做时

sf::Texture texture;
texture.loadFromFile(filename);

return sf::Sprite(texture);

texture
是一个局部变量,在函数结束时不再存在。因此,精灵持有指向已删除对象的指针。

您需要将纹理加载到比精灵寿命更长的范围内,或者使用动态(堆)内存来分配它。

© www.soinside.com 2019 - 2024. All rights reserved.