我在windows上用cmake创建了一个sfml项目,但图像无法显示。
src/main.cpp
#include "game.hpp"
#include <SFML/Graphics.hpp>
int main() {
Game game;
sf::Clock clock;
sf::Time elapsed;
float frametime = 1.0f / 60.0f;
while (game.window.isOpen()) {
sf::Event event;
while (game.window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
game.window.close();
}
}
// 1. 事件处理
game.handleInput();
// 2. 更新物理逻辑
if (elapsed.asSeconds() >= frametime) {
elapsed -= sf::seconds(frametime);
game.update(); // 60次/秒
}
elapsed += clock.restart();
// 3. 渲染
game.window.clear();
game.render();
game.window.display();
}
return 0;
}
字符串
src/game.hpp
class Game {
public:
sf::RenderWindow window;
sf::Sprite s;
Game() {
window.create({320, 480}, "hello");
sf::Texture t;
t.loadFromFile("images/tiles.png");
s.setTexture(t);
}
void handleInput() {}
void update() {}
void render() { window.draw(s); }
};
型
如果我把draw代码放到main.cpp
中,它就可以工作了。像这样:
src/main.cpp
...
// 3. 渲染
game.window.clear();
// game.render();
sf::Texture t;
t.loadFromFile("images/tiles.png");
sf::Sprite s(t);
game.window.draw(s);
game.window.display();
...
型
我想知道它是怎么运作的
1条答案
按热度按时间ztmd8pv51#
sfml有一个关于这个白色正方形问题的FAQ
这是一个常见的错误。当您设置精灵的纹理时,它在内部所做的只是存储指向纹理示例的指针。因此,如果纹理被破坏或移动到内存中的其他位置,精灵最终会得到一个无效的纹理指针。
您必须正确管理纹理的生命周期,并确保它们在任何精灵使用时都有效。
你应该把你的
sf::Texture t
存储为你的类的一个成员,这样它就和你的精灵有相同的生命周期,你的精灵就不会试图绘制一个被破坏的纹理。