You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:29:32