【问题标题】:Variable don't update from sfml event loop变量不会从 sfml 事件循环中更新
【发布时间】:2021-06-27 10:03:48
【问题描述】:

我正在为我的图形使用 sfml 库。在暂停期间,我想避免在屏幕上绘图。我想使用 sf::Event::MouseButtonPressed 拦截空格键。在调试模式下,事件拦截成功,但正常执行失败,为什么?布尔变量“暂停”似乎没有更新。

while (window.isOpen()) {
    Event event;
    while (window.pollEvent(event)) {
                /*..*/              
                if (event.type = Event::KeyPressed) {
                    if (event.key.code == Keyboard::Space) {
                        if (!paused) {
                            paused = true;// UDATE HERE
                        }
                        else
                            if (paused)
                            {
                                paused = false; // UDATE HERE
                            }
                    }
                }
    }    
    if (!paused)  //// UDATE DONT SEEM TO AFFECT HERE
    {
        /* draw here */
    }    
}

已编辑:甚至尝试将变量 paused 声明为原子,但仍然不起作用。

【问题讨论】:

  • 请尝试创建minimal reproducible example 向我们展示。尝试创建此类示例的过程可能会帮助您发现问题。
  • 另外,如果某些东西似乎在“调试”构建中有效,但在(优化的)“发布”构建中失败,这主要表明您做了导致未定义行为。使用额外的警告构建并将任何可能的警告视为必须修复的错误。这应该是避免此类问题的良好开端。如果您没有收到任何警告,那么您需要使用其他调试方法(rubber duck 或“printf”调试)以及对您的minimal reproducible example 进行代码审查以帮助解决问题。也许您拥有并使用未初始化的变量?
  • 我将更改代码以使其最小化

标签: c++ sfml


【解决方案1】:

使用Event::KeyReleased 而不是Event::KeyPressed,因为每次按下按键导致多次输入的循环都会调用按键,而每次点击仅调用一次Release 事件。

【讨论】:

  • 这是个好习惯。但是我已经声明了using namespace sf;,否则程序甚至无法运行。
  • 啊,明白了,也许尝试使用 unicode 代替?我相信它的 event.text.unicode == 18 (18 可能是错误的,但如果我没记错的话应该是空格字符)
  • 调试模式下,键盘事件被拦截,正常工作。
  • 好的,我知道了!使用 Event::KeyReleased 事件而不是 Event::KeyPressed 事件,因为当您只寻找单次按下时,只要按下一个键,按下事件就会消失
  • 是的,你没看错,是按键反弹的问题。我修好了它。如果您更新您的回复,我可以接受它作为正确答案。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多