You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SFML技术求助:如何实现物体定时自动移动与键盘触发独立移动

解决SFML中双物体独立运动问题:键盘控制+定时自动移动

嘿,我来帮你搞定这个问题!你现在的核心问题是自动移动的物体每帧都在执行move操作,所以它会疯狂移动,完全不是你想要的“每隔10秒一次”的效果。我们可以用SFML自带的sf::Clock来实现精确定时,同时保留键盘控制的独立性。

下面是修改后的完整可行代码,我会把关键细节标注清楚:

#include <SFML/Graphics.hpp>
#include <vector>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Dual Object Movement");
    // 假设m_mo是存储两个可移动图形的容器,这里用矩形示例
    std::vector<sf::RectangleShape> m_mo;
    m_mo.emplace_back(sf::Vector2f(50.f, 50.f)); // 第一个物体(键盘控制)
    m_mo.emplace_back(sf::Vector2f(50.f, 50.f)); // 第二个物体(定时自动移动)
    m_mo[0].setFillColor(sf::Color::Red);
    m_mo[1].setFillColor(sf::Color::Blue);
    m_mo[1].setPosition(100.f, 0.f); // 给自动移动的物体一个初始偏移,方便区分

    // 初始化计时器,用于控制自动移动的间隔
    sf::Clock autoMoveClock;
    const sf::Time autoMoveInterval = sf::seconds(10.f); // 设定10秒的间隔

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            switch (event.type) {
                case sf::Event::Closed:
                    window.close();
                    break;
                case sf::Event::KeyPressed:
                    // 只有按下键盘时,才移动第一个物体
                    m_mo[0].move(0.f, 50.f);
                    break;
            }
        }

        // 检查是否到了自动移动的时间点
        if (autoMoveClock.getElapsedTime() >= autoMoveInterval) {
            m_mo[1].move(0.f, 50.f); // 执行自动移动
            autoMoveClock.restart(); // 重置计时器,开始下一轮10秒计时
        }

        window.clear();
        window.draw(m_mo[0]);
        window.draw(m_mo[1]); // 修正了你代码里的笔误:m-mo[1] → m_mo[1]
        window.display();
    }

    return 0;
}

关键逻辑说明:

  • 键盘控制部分:保留了你原来的KeyPressed事件响应逻辑,只有当键盘被按下时才触发第一个物体的移动,完全独立于帧循环。
  • 定时自动移动部分
    1. sf::Clock记录从上次移动到当前的时间差
    2. 每次循环检查时间差是否达到了设定的10秒间隔
    3. 一旦满足条件,就执行移动操作,然后重启计时器,确保下一次移动依然是10秒后
  • 顺带修正了你代码里的小笔误:把window.draw(m-mo[1])改成了正确的window.draw(m_mo[1])

这样两个物体的运动就完全独立了:一个靠键盘触发移动,另一个严格按照每10秒一次的节奏自动移动。

内容的提问来源于stack exchange,提问作者Mr.JOEJOE

火山引擎 最新活动