Windows下CMake构建SFML项目图片无法显示问题求助
问题原因
- SFML里的
sf::Sprite不存储图像数据,只持有对sf::Texture的引用。你在Game类构造函数里定义的sf::Texture t是局部变量,构造函数执行完后这个纹理就会被销毁,此时Sprite引用的纹理已经不存在,自然没法渲染出图像。 - 而在
main.cpp渲染循环里创建sf::Texture t时,这个纹理的生命周期覆盖了window.draw(s)的执行过程,Sprite能正常拿到有效纹理数据,所以可以显示图片。
解决方法
把sf::Texture改成Game类的成员变量,让它的生命周期和Sprite保持一致,这样Sprite就能始终引用有效的纹理数据。
修改后的game.hpp代码:
class Game { public: sf::RenderWindow window; sf::Texture t; // 将Texture设为类成员变量 sf::Sprite s; Game() { window.create({320, 480}, "hello"); t.loadFromFile("images/tiles.png"); // 使用类成员Texture加载图片 s.setTexture(t); } void handleInput() {} void update() {} void render() { window.draw(s); } };
额外注意点:
- 确认
images/tiles.png路径正确:CMake编译后的可执行文件会从当前工作目录查找该路径,你可以通过CMake配置自动复制资源文件到输出目录,或者先使用绝对路径测试。 - 加载纹理时可以添加失败判断,比如
if (!t.loadFromFile("images/tiles.png")) { /* 这里写加载失败的处理逻辑,比如打印错误 */ },方便排查路径错误或文件损坏问题。
内容的提问来源于stack exchange,提问作者weiweiwei
相关产品推荐
相关产品推荐

