C++ 函数被多次调用

C++ 函数被多次调用,c++,sfml,game-development,C++,Sfml,Game Development,因此,跟踪用户输入的游戏循环函数被多次调用。我猜这是因为游戏循环每秒进行40次迭代,如果我按住键0.5秒,函数就会被调用20次。我也尝试用sfml事件来处理这个问题,但它不起作用window.setKeyRepeatEnabled(false)。我怎样才能解决这个问题 //this gets called 20-30times if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { leftPlayerPoints++; } 使用两个

因此,跟踪用户输入的游戏循环函数被多次调用。我猜这是因为游戏循环每秒进行40次迭代,如果我按住键0.5秒,函数就会被调用20次。我也尝试用sfml事件来处理这个问题,但它不起作用
window.setKeyRepeatEnabled(false)
。我怎样才能解决这个问题

//this gets called 20-30times
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    leftPlayerPoints++;
}
使用两个布尔标志:一个用于检查键是否按下,另一个用于检查操作是否已发生

简言之

if (key_is_pressed)
{
    if (!action_have_happened)
    {
        // Perform action...
        action_have_happened = true;
    }
    // Else: Action have already happened this key-press, don't do it again
}

释放按键时,重置两个标志(至
false
)。

这正是
IsKeyPressed
要做的,您必须使用位屏蔽并使其切换状态,而不是继续按下

下面是Win32API(C++)的代码。我知道SFML有不同于Win32API的事件,但屏蔽也应该在SFML中工作


这里的要点是
key\u state&0x10x1

的代码>位屏蔽不使用计数器,而是使用布尔标志?当第一次按下某个键时,设置一个标志,释放时清除该标志。检查主游戏事件循环中的标志。这正是按下
isKeyPressed
的目的。如果您对按下按钮感兴趣,请检查
按键按下
按键释放
事件。这在他们的网页上的基本教程中有描述。顺便说一句。@一些程序员哥们,不知道,boolean在~40次迭代期间将为真,直到KeyReleased事件。这是可行的,但最好使用内置的SFML事件
sf::event::KeyPressed
,而不是重新发明轮子。@Lucscharbannier,你是什么意思
sf::Event::KeyPressed
没有帮助。你能解释一下吗?
BOOL IsKeyToggled(CONST INT key)
{
    SHORT key_state = GetAsyncKeyState(key);
    BOOL is_toggled = key_state & 0x1;
    return is_toggled;
}