如何重写sf::Drawable::draw()?SFML矩形绘制不显示问题求助
问题解决:SFML矩形不显示的修复方案
1. 核心错误:渲染顺序颠倒
你的Game::run()方法里渲染步骤顺序完全错误。SFML正确的渲染流程是清空窗口 → 绘制所有内容 → 显示窗口,而你现在先清空后直接显示,绘制操作在显示之后执行,导致绘制的内容永远不会被展示出来。
修改后的run()方法代码:
void Game::run() { while (mWindow.isOpen()) { mWindow.clear(sf::Color::Black); render(); // 先绘制内容 mWindow.display(); // 再将绘制内容显示到窗口 ProcessEvent(); // 必须处理事件,否则窗口无法正常关闭 } }
2. 关键检查:SceneNode类的继承正确性
你提到SceneNode继承自sf::Drawable,但未提供头文件代码,必须确保类定义正确继承并实现虚函数:
SceneNode.h的正确写法:
#ifndef _SCENE_NODE_H_ #define _SCENE_NODE_H_ #include <SFML/Graphics.hpp> class SceneNode : public sf::Drawable { public: SceneNode(sf::Vector2f size, sf::Color color); private: // 重写sf::Drawable的纯虚draw函数 void draw(sf::RenderTarget& target, sf::RenderStates states) const override; sf::RectangleShape rect; }; #endif // _SCENE_NODE_H_
3. 补充:实现事件处理函数
当前代码中ProcessEvent()未实现,会导致窗口运行后无法关闭,需补充实现:
void Game::ProcessEvent() { sf::Event event; while (mWindow.pollEvent(event)) { if (event.type == sf::Event::Closed) mWindow.close(); } }
4. 小细节:颜色设置冲突
你在Game构造函数初始化sn时传入sf::Color::Blue,但SceneNode构造函数又将矩形颜色设为sf::Color::Red,这会导致颜色被覆盖,不过这不是矩形不显示的原因,仅为逻辑小问题。
完成以上修改后,红色矩形就会显示在窗口左上角了。
内容的提问来源于stack exchange,提问作者heeyoung abc
相关产品推荐
相关产品推荐

