Как я могу предотвратить отправку каждого ключа в KeyboardUpFunc в GLUT? - PullRequest
1 голос
/ 16 октября 2011

Я довольно новичок в OpenGL и пишу простую игру в 2D, для развлечения. Тем не менее, я столкнулся с проблемой, с которой мне тяжело оборачиваться.

Кажется, что всякий раз, когда вызывается моя клавиатураUpFunc, в функцию посылается не только клавиша, которая фактически пришла, но и каждая клавиша, которая в данный момент нажата.

Я использую простой буфер ключей для управления ключами, keyUp помечает ключ как up и вызывается только в этой функции. keyDown вызывается в моей клавиатуре. isDown возвращает логическое значение того, нажата ли клавиша или нет. Возьмите этот код, например:

#include <iostream>
...

void keyboardUp(unsigned char key, int x, int y)
{
    keys.keyUp(key);
    if (keys.isDown('s') == false)
    {
        std::cout << "It's resetting s as well!" << std::endl;
    }
    // reset acceleration here, for each key
    if ( (key == 'w') || (key == 's') )
    {
        yStep = 0.1;
    }
    if ( (key == 'a') || (key == 'd') )
    {
        xStep = 0.1;
    }

    std::cout << key << " is now up." << std::endl;
}

Если вы запустите этот код, если вы, например, удерживаете клавиши S и D, а затем отпустите клавишу D, вы заметите, что буква S тоже помечена как повышенная, так как вызывается только это местоположение ключа.

Предполагая, что мой код keyBuffer работает правильно (и это так, но дайте мне знать, если вы хотите, чтобы я его опубликовал ...), есть ли способ обойти это? Где, если бы вы удерживали клавишу, а затем нажимали другую клавишу, приложение вернулось бы к тому, что вы делали, когда вы просто держали исходную клавишу? Вместо того, чтобы отмечать как вверх? Или это невозможно с GLUT?

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Я изменил свою реализацию буфера клавиатуры, и то, что я описал выше, теперь работает.Разница в том, что раньше я использовал вектор для наложения клавиш, которые нажимались, тогда как сейчас я использую массив логических значений фиксированного размера.

По-видимому, векторная реализация буфера клавишне будет работать правильно с GLUT.

0 голосов
/ 16 октября 2011

Не очень понятно, что происходит не так. Но где / как именно вы вызываете эту функцию ?? Прямо в цикле основной игры, или вы проверяете определенные условия в функции «обновления». Я спрашиваю, потому что вам нужно проверять ввод при каждом запуске бесконечного цикла, и если вы используете логическое значение, чтобы определить, не нажата ли клавиша, вы должны сбросить ее после выполнения соответствующего действия. Во всяком случае, только мои 2 цента.

...