Есть ли способ проверить буфер ключа переизбытка? - PullRequest
1 голос
/ 01 апреля 2012

РЕДАКТИРОВАНИЕ С РЕШЕНИЕМ

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

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

Так что мой вопрос таков:

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

РЕШЕНИЕ:

На самом деле я нигде больше не выполняю никаких циклов (кроме циклического перемещения по массивам для обновления местоположений моего фейерверка и т. Д.), Я делаю что-то вроде

в основном, добавьте это:

int main(int argc, char** argv){

    //Usual glut initializations
    glutTimerFunc(30, update, -1);//says in 30miliseconds call update
    glutDisplayFunc(display);   
    glutMainLoop();

    return 0;   
}

Затем в вашей функции обновления (в параметрах для glutTimerFunc, так что-то вроде этого:

void update(int k){

    //UPDATE POSITION OF FIREWORKS
    glutTimerFunc(30, update, -1);//it is important to add this
    glutPostRedisplay();//calls display() on the next iteration of glut's main loop
}

Затем, наконец, в функции отображения сделайте все, что вам нужно, чтобы нарисовать один кадр (в моем случае, пролистайте каждый фейерверк и нарисуйте его!)

Надеюсь, это поможет:)

1 Ответ

2 голосов
/ 01 апреля 2012

Вы делаете это неправильно.

Ваш обработчик нажатия клавиш должен не зацикливаться на чем-либо.Ваш обработчик нажатия клавиш должен просто установить некоторую переменную и вернуть.

Ваша основная функция отображения (которая должна управляться функцией таймера, которая вызывает glutPostRedisplay) должна проверить эту переменную.Если он установлен, то он должен запускать ваш фейерверк и циклы в течение некоторого времени.

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

...