Я довольно новичок в 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?