SFML中能否停止或删除Clock?相关矩形绘制需求咨询
SFML: 冻结Clock以停止矩形放大并创建新矩形是否可行?
当然可行!不过得先说明:SFML的sf::Clock本身并没有直接的“冻结”或“暂停”方法,但我们完全可以通过记录状态和尺寸的方式实现你要的效果——甚至比直接冻结Clock更灵活。
先看你的原代码问题:你现在是直接用timer.getElapsedTime()实时计算矩形大小,4秒后重启Clock让矩形重置。要实现“保留4秒时的尺寸,然后在旁边画新的放大矩形”,我们需要把第一个矩形的最终尺寸存下来,停止它的放大逻辑,同时为新的矩形开启独立的放大计时。
修改后的代码示例
#include <SFML/Graphics.hpp> int main() { sf::RenderWindow window(sf::VideoMode(1800, 800), "Rectangles"); // 第一个矩形的状态:尺寸、是否已停止放大 sf::Vector2f firstRectSize; bool isFirstRectFrozen = false; // 新矩形的计时(第一个冻结后启用) sf::Clock newRectTimer; bool isNewRectActive = false; // 初始计时(控制第一个矩形的放大) sf::Clock timer; while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); // 处理第一个矩形的逻辑 if (!isFirstRectFrozen) { sf::Time elapsed = timer.getElapsedTime(); firstRectSize = sf::Vector2f(elapsed.asSeconds() * 50, 100); // 4秒后停止放大第一个矩形,激活新矩形的计时 if (elapsed.asSeconds() > 4) { isFirstRectFrozen = true; isNewRectActive = true; newRectTimer.restart(); // 启动新矩形的计时 } } // 绘制第一个矩形(用保存的尺寸或实时计算的尺寸) sf::RectangleShape firstShape(firstRectSize); firstShape.setPosition(100, 400); firstShape.setFillColor(sf::Color(150, 150, 150)); window.draw(firstShape); // 处理并绘制新矩形(如果已激活) if (isNewRectActive) { sf::Time newElapsed = newRectTimer.getElapsedTime(); sf::Vector2f newRectSize(newElapsed.asSeconds() * 50, 100); // 新矩形放在第一个的右边,偏移量设为第一个的宽度+20 sf::RectangleShape newShape(newRectSize); newShape.setPosition(100 + firstRectSize.x + 20, 400); newShape.setFillColor(sf::Color(100, 200, 100)); window.draw(newShape); // 如果新矩形也到了4秒,你可以选择停止它、再创建下一个,这里示例中只是保留它的尺寸 // 比如添加:if (newElapsed.asSeconds() >4) isNewRectActive = false; 来停止新矩形放大 } window.display(); } return 0; }
关键逻辑解释
- 状态标记:用
isFirstRectFrozen判断第一个矩形是否已经停止放大,一旦到4秒,就把它的尺寸存在firstRectSize里,之后绘制时直接用这个固定值。 - 独立计时:新矩形用单独的
newRectTimer计时,避免和第一个矩形的计时冲突,这样两个矩形的放大逻辑完全独立。 - 位置偏移:新矩形的位置通过第一个矩形的宽度计算,保证它始终在第一个矩形的旁边。
如果一定要模拟“冻结Clock”怎么办?
如果你非要实现类似“冻结”原Clock的效果,其实可以记录冻结时的时间点,之后不再用实时的getElapsedTime(),而是用这个记录的时间:
sf::Clock timer; sf::Time frozenTime; bool isFrozen = false; // 当需要冻结时: if (!isFrozen && timer.getElapsedTime().asSeconds() >4) { frozenTime = timer.getElapsedTime(); isFrozen = true; } // 计算尺寸时: sf::Vector2f shapeSize = isFrozen ? sf::Vector2f(frozenTime.asSeconds()*50,100) : sf::Vector2f(timer.getElapsedTime().asSeconds()*50,100);
这种方式也能实现第一个矩形停止放大的效果,但对于多矩形的场景,还是用独立变量和计时的方式更清晰。
内容的提问来源于stack exchange,提问作者db14
相关产品推荐
相关产品推荐

