SFML游戏主菜单Play和Exit按钮无法独立触发功能如何修复?
问题根因
你当前的回车键触发逻辑完全没有关联按钮选中状态,所有判断都是脱离isPlayButtonSelected/isExitButtonSelected这两个选中标记的错误逻辑:
- 原始Enter逻辑:先把两个pressed标记设为false,然后第一个判断
!isPlayButtonPressed永远为真,直接把playPressed设为true,后续else if永远不会走,所以不管选哪个按钮都只会触发开始游戏 - 你修改后的Enter逻辑:两个if判断独立,先把playPressed设为true,再判断
!isExitButtonPressed也为真,直接把exitPressed也设为true,所以两个操作都会执行,优先触发退出
修复步骤
1. 修正回车键触发逻辑
把Enter分支的逻辑替换为根据当前选中的按钮设置对应按下标记,不要无意义的初始化两个pressed为false再独立判断:
case sf::Keyboard::Enter: { // 先重置两个按下标记,避免残留状态 isPlayButtonPressed = false; isExitButtonPressed = false; // 根据当前选中状态决定触发哪个按钮的按下事件 if (isPlayButtonSelected) { isPlayButtonPressed = true; } else if (isExitButtonSelected) { isExitButtonPressed = true; } break; }
2. 修正Update方法的执行逻辑,执行完操作后重置按下标记
避免单次按下被重复触发多次:
void MainMenu::Update(sf::Time deltaTime) { // 按钮悬停样式逻辑可以保留 if(isPlayButtonSelected) { playButton.setFillColor(sf::Color::Blue); exitButton.setFillColor(sf::Color::White); } else { exitButton.setFillColor(sf::Color::Blue); playButton.setFillColor(sf::Color::White); } if(isPlayButtonPressed) { // 先重置按下标记再切换状态,避免残留 isPlayButtonPressed = false; context->states->Add(std::make_unique<GamePlay>(context), true); } else if(isExitButtonPressed) { isExitButtonPressed = false; context->window->close(); } }
内容的提问来源于stack exchange,提问作者Victor Cano
相关产品推荐
相关产品推荐

