SFML玩家移动异常:仅移动鼠标时速度正常的问题求助
SFML玩家移动速度异常问题解决
核心问题
你把玩家移动逻辑和窗口渲染代码放在了sf::Event的循环内部,这意味着只有当有事件(比如窗口调整大小、按键触发、鼠标移动等)发生时,才会执行一次移动和渲染操作。没有事件触发时,这段代码完全不运行,所以移动看起来极慢;而移动鼠标时会持续产生MouseMoved事件,事件循环频繁执行,移动速度也就恢复正常了。
修复方案
- 将玩家移动、窗口渲染的代码移到事件循环外部,也就是主循环(
while (window.isOpen()))内、事件处理循环(while (window.pollEvent(evnt)))外,这样每帧都会执行移动和渲染。 - 使用Delta时间控制移动速度,避免帧率变化影响移动速率,保证不同设备上移动速度一致。
修复后的完整代码
#include <SFML\Graphics.hpp> #include <iostream> int main() { sf::RenderWindow window(sf::VideoMode(512, 512), "SFML Tutorial", sf::Style::Close | sf::Style::Resize); sf::RectangleShape player(sf::Vector2f(100.0f, 100.0f)); player.setFillColor(sf::Color::Red); sf::Clock deltaClock; while (window.isOpen()) { float deltaTime = deltaClock.restart().asSeconds(); const float moveSpeed = 200.0f; // 单位:像素/秒 sf::Event evnt; while (window.pollEvent(evnt)) { switch (evnt.type) { case sf::Event::Closed: window.close(); break; case sf::Event::Resized: printf("New Window Width: %i New Window Height: %i\n", evnt.size.width, evnt.size.height); break; case sf::Event::TextEntered: if (evnt.text.unicode < 128) { printf("%c", evnt.text.unicode); } } } // 移动逻辑:每帧执行一次 if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) { player.move(-moveSpeed * deltaTime, 0.0f); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) { player.move(moveSpeed * deltaTime, 0.0f); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) { player.move(0.0f, -moveSpeed * deltaTime); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) { player.move(0.0f, moveSpeed * deltaTime); } // 渲染逻辑:每帧执行一次 window.clear(); window.draw(player); window.display(); } return 0; }
补充说明
- Delta时间(
deltaTime)是从上一帧到当前帧的时间间隔,用移动速度乘以这个值,就能让玩家每秒移动固定像素数,不会因为帧率波动导致移动速度忽快忽慢。 - 事件循环只负责处理用户输入事件(比如窗口关闭、按键按下/释放),游戏逻辑和渲染应该放在主循环的每帧流程里。
内容的提问来源于stack exchange,提问作者The Crazy Creeper
相关产品推荐
相关产品推荐

