Проблемы с обратным вызовом клавиатуры GLUT с C

В настоящее время я пишу версию breakout для быстрого изучения C и OpenGL.

У меня проблемы с перемещением весла. Я установил обратный вызов клавиатуры, чтобы при нажатии стрелки влево он вычитал 1 из значения x на манипуляторе и добавлял 1 к значению x при нажатии стрелки вправо.

Имея это в виду, весло движется невероятно медленно, когда я удерживаю любую клавишу. Я могу изменить это, увеличив значение x, например, до 10. Когда я делаю это, кажется, что ракетка заикается по экрану, потому что она прыгает по 10 раз за раз. Конечно, теперь он движется быстрее по экрану, но не выглядит плавным.

Я использую GLUT для работы с окнами на OSX.

Есть ли способ ускорить это и сохранить гладкость?


person Jamie White    schedule 23.03.2011    source источник
comment
Вы используете glutPostRedisplay() в обратном вызове glutKeyboardFunc() или в обратном вызове glutIdleFunc()?   -  person genpfault    schedule 23.03.2011
comment
Я вызываю повторное отображение в обратном вызове бездействия, а не в обратном вызове клавиатуры   -  person Jamie White    schedule 24.03.2011


Ответы (2)


Вот код одного из моих проектов:

bool keyDown[256];

...

//Called when a key is pressed
void handleKeypress(unsigned char key, int x, int y) {  
    keyDown[key] = true;
}

void handleKeyUp(unsigned char key, int x, int y){
    keyDown[key] = false;
}

По сути, это сохраняет массив состояний каждой клавиши, поэтому вы можете просто проверять их каждый раз. Тогда вам не придется зависеть от частых обратных вызовов.

person Chris Cooper    schedule 23.03.2011

Обычная вещь в играх — массив клавиатуры. Поэтому вы также сможете нажимать несколько кнопок одновременно.

У вас есть массив, в котором вы сохраняете состояние клавиш (вы ставите 1 при нажатии, устанавливаете 0 при отпускании). И вы обрабатываете игру в каждом кадре, беря информацию только из массива, а не напрямую из ввода.

person mechu    schedule 23.03.2011
comment
Спасибо, это отличный ответ. Кажется таким простым! - person Jamie White; 24.03.2011