cmake sfml -图像无法显示

dsf9zpds  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(256)

我在windows上用cmake创建了一个sfml项目,但图像无法显示。
src/main.cpp

  1. #include "game.hpp"
  2. #include <SFML/Graphics.hpp>
  3. int main() {
  4. Game game;
  5. sf::Clock clock;
  6. sf::Time elapsed;
  7. float frametime = 1.0f / 60.0f;
  8. while (game.window.isOpen()) {
  9. sf::Event event;
  10. while (game.window.pollEvent(event)) {
  11. if (event.type == sf::Event::Closed) {
  12. game.window.close();
  13. }
  14. }
  15. // 1. 事件处理
  16. game.handleInput();
  17. // 2. 更新物理逻辑
  18. if (elapsed.asSeconds() >= frametime) {
  19. elapsed -= sf::seconds(frametime);
  20. game.update(); // 60次/秒
  21. }
  22. elapsed += clock.restart();
  23. // 3. 渲染
  24. game.window.clear();
  25. game.render();
  26. game.window.display();
  27. }
  28. return 0;
  29. }

字符串
src/game.hpp

  1. class Game {
  2. public:
  3. sf::RenderWindow window;
  4. sf::Sprite s;
  5. Game() {
  6. window.create({320, 480}, "hello");
  7. sf::Texture t;
  8. t.loadFromFile("images/tiles.png");
  9. s.setTexture(t);
  10. }
  11. void handleInput() {}
  12. void update() {}
  13. void render() { window.draw(s); }
  14. };


如果我把draw代码放到main.cpp中,它就可以工作了。像这样:
src/main.cpp

  1. ...
  2. // 3. 渲染
  3. game.window.clear();
  4. // game.render();
  5. sf::Texture t;
  6. t.loadFromFile("images/tiles.png");
  7. sf::Sprite s(t);
  8. game.window.draw(s);
  9. game.window.display();
  10. ...


我想知道它是怎么运作的

ztmd8pv5

ztmd8pv51#

sfml有一个关于这个白色正方形问题的FAQ
这是一个常见的错误。当您设置精灵的纹理时,它在内部所做的只是存储指向纹理示例的指针。因此,如果纹理被破坏或移动到内存中的其他位置,精灵最终会得到一个无效的纹理指针。
您必须正确管理纹理的生命周期,并确保它们在任何精灵使用时都有效。
你应该把你的sf::Texture t存储为你的类的一个成员,这样它就和你的精灵有相同的生命周期,你的精灵就不会试图绘制一个被破坏的纹理。

相关问题