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

为何调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:35:19