SFML单次按键检测异常:按下一次触发多次响应问题求助
问题解决:SFML单次按键检测重复触发
你的代码核心问题是按键检测逻辑放在了事件循环之外。pollEvent循环结束后,event变量会保留最后一次事件的状态,主循环每迭代一次都会重新检查这个旧事件,导致同一个按键事件被重复处理多次。
修复后的代码示例
while (window.isOpen()) { sf::Event event; // 所有事件处理都放在pollEvent内部循环中 while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); } else if (event.type == sf::Event::KeyPressed) { // 直接处理KeyPressed事件 bool rightArrowKey = event.key.code == sf::Keyboard::Right; bool leftArrowKey = event.key.code == sf::Keyboard::Left; if (leftArrowKey) { if (selectedCharacter == 0) { selectedCharacter = characterList.size() - 1; } else { selectedCharacter--; } changeCharacters(characterList[selectedCharacter], font, characterScreen); std::cout << "left pressed" << std::endl; } else if (rightArrowKey) { if (selectedCharacter == characterList.size()-1) { selectedCharacter = 0; } else { selectedCharacter++; } changeCharacters(characterList[selectedCharacter], font, characterScreen); } } characterScreen.handleEvent(event, window); } window.clear(sf::Color::White); characterScreen.update(); characterScreen.render(window); window.display(); }
额外注意事项
- 确保调用
window.setKeyRepeatEnabled(false),放在窗口创建之后、主循环之前,禁用系统级按键重复,避免按住按键时连续触发KeyPressed事件。 - 不要在事件循环外依赖
event变量的状态,当pollEvent返回false时,event的内容是未定义的,可能残留之前的事件数据。
内容的提问来源于stack exchange,提问作者Bondar
相关产品推荐
相关产品推荐

