// 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);
}
结果:
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 函数 - 在下一帧中绘制图像,并在下一帧中删除纹理,如何使纹理具有无限生命周期?
当你这样做时
sf::Texture texture;
texture.loadFromFile(filename);
return sf::Sprite(texture);
texture
是一个局部变量,在函数结束时不再存在。因此,精灵持有指向已删除对象的指针。
您需要将纹理加载到比精灵寿命更长的范围内,或者使用动态(堆)内存来分配它。