Функция вызывается несколько раз - PullRequest
1 голос
/ 21 июня 2020

Итак, внутри игры функция l oop, отслеживающая ввод пользователя, вызывается несколько раз. Я предполагаю, что это происходит потому, что игра l oop проходит как 40 итераций каждую секунду, и если я удерживаю клавишу в течение 0,5 секунды, функция вызывается 20 раз. Я тоже пытался справиться с этим с помощью sfml-событий, но это не сработало window.setKeyRepeatEnabled(false). Как я могу это решить?

//this gets called 20-30times
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    leftPlayerPoints++;
}

Ответы [ 2 ]

1 голос
/ 19 июля 2020

Это именно то, что должен делать IsKeyPressed, вам нужно использовать битовую маску и заставить его переключать состояние вместо того, чтобы продолжать нажимать.

Ниже приведен код из Win32API (C ++). Я знаю, что SFML имеет события, отличные от Win32API , но маскирование также должно работать в SFML .

BOOL IsKeyToggled(CONST INT key)
{
    SHORT key_state = GetAsyncKeyState(key);
    BOOL is_toggled = key_state & 0x1;
    return is_toggled;
}

Главное здесь key_state & 0x1; битовая маскировка с помощью 0x1

1 голос
/ 15 июля 2020

Используйте два логических флага: один для проверки, нажата ли клавиша или нет, а другой используется для проверки, произошло ли действие еще.

Короче, что-то вроде

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).

...