为何调用window.setKeyRepeatEnabled(false)无法禁用SFML按键重复?
禁用按键重复触发无效的原因及解决办法
问题根源
window.setKeyRepeatEnabled(false)仅对SFML的事件驱动机制生效,也就是通过pollEvent捕获的sf::Event::KeyPressed事件。- 你当前使用的
sf::Keyboard::isKeyPressed是直接读取硬件按键的实时状态,只要按键处于按住状态,每帧都会返回true,这个逻辑不受按键重复设置的影响,所以会导致a持续递增。
修复后的代码
#include<iostream> #include<SFML/Graphics.hpp> int main(int argc, char const *argv[]) { sf::RenderWindow window(sf::VideoMode(800,600),"shape change color",sf::Style::Close); window.setKeyRepeatEnabled(false); int a=0; while (window.isOpen()) { sf::Event event; while(window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); // 处理按键按下事件 if (event.type == sf::Event::KeyPressed) { if (event.key.code == sf::Keyboard::Escape) window.close(); else if (event.key.code == sf::Keyboard::A) a++; } } std::cout << a << std::endl; window.clear(); window.display(); } return 0; }
关键修改说明
- 将
a++的逻辑移到事件循环内,仅在KeyPressed事件触发时执行一次。 - 增加
event.type == sf::Event::KeyPressed的判断,确保只响应按键按下的单次事件。 - 此时
setKeyRepeatEnabled(false)会生效:按住A键时,系统只会发送一次KeyPressed事件,a只会递增一次,直到松开按键再次按下才会触发下一次。
内容的提问来源于stack exchange,提问作者user18014778
相关产品推荐
相关产品推荐

