Я работаю над получением ввода клавиатуры для работы в GLUT, у меня довольно много времени. В основном моя проблема заключается в том, что операции, которые я установил для определенных клавиш, работают неправильно.Вход в глушитель не регистрируется без нечетной петли, чтобы помочь
Это мое заявление и определение glutKeyboardFunc и glutKeyboardUpFunc:
glutKeyboardFunc(keyPressed);
glutKeyboardUpFunc(keyUp);
void keyPressed (unsigned char key, int x, int y) {
keyStates[key] = true;
}
void keyUp (unsigned char key, int x, int y) {
keyStates[key] = false;
}
Цель с ними просто установить ключ к истинным, когда она нажата и ложно, когда он будет выпущен.
Я тогда определить некоторые вещи, чтобы сделать на основании которых нажаты клавиши:
void keyOperations (void) {
if (keyStates[int('w')] || keyStates[int('W')]){
xspeed-=0.001f;
}
if (keyStates[int('s')] || keyStates[int('S')]){
xspeed+=0.001f;
}
if (keyStates[int('a')] || keyStates[int('A')]){
yspeed+=0.001f;
}
if (keyStates[int('d')] || keyStates[int('D')]){
yspeed-=0.001f;
}
if (keyStates[' ']){
yspeed=0.0f;
xspeed=0.0f;
}
}
keyOperations Затем вызывается в моей glutDisplayFunc.
void display(void) {
keyOperations();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,-1.0f,z);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);glVertex3f(-100.0f, -0.0001f, -100.0f);
glTexCoord2f(0.0f, 1.0f);glVertex3f(100.0f, -0.0001f, -100.0f);
glTexCoord2f(0.0f, 0.0f);glVertex3f(100.0f, -0.0001f, 100.0f);
glTexCoord2f(1.0f, 0.0f);glVertex3f(-100.0f, -0.0001f, 100.0f);
glEnd();
xrot+=xspeed;
yrot+=yspeed;
glutSwapBuffers();
}
Если вы все еще со мной, моя основная функция наряду с некоторыми переменными выглядеть следующим образом:
GLfloat xrot;
GLfloat yrot;
GLfloat xspeed;
GLfloat yspeed;
GLfloat z=-50.0f;
bool* keyStates = new bool[256];
int main (int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Test");
for(int i=0; i<=255; i++){ //this is the odd loop I'm referring to
keyStates[i]=0;
}
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glutDisplayFunc(display);
glutIdleFunc (display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyPressed);
glutKeyboardUpFunc(keyUp);
glutMainLoop();
}
для цикла я включил в основной функции сбрасывает массив целых keyStates к 0. В конечном итоге это должно иметь тот же эффект, что и glutKeyboardUpFunc, но по какой-то причине keyOperations не выполняются должным образом без этого цикла.
Я искал некоторые примеры кода, похожие на мои, используя glutKeyboardUpFunc, но он не прошел хорошо с точки зрения поиска чего-то значительно похожего. Я знаю, что операции внутри glutKeyboardUpFunc и glutKeyboardFunc выполняются просто вставляя какую-то команду выхода, когда она добирается до этой части кода.
Этот код должен компилироваться в текущей форме, если вы удалите glutReshapeFunc (reshape);
Мой вопрос конкретно: что относительно этого для цикла вызывает желаемый эффект вращения, который, кажется, не происходит без него? И если вы знаете, как я могу это исправить?
Кроме того, вращение на пустой плоскости путем нажатия клавиш a и d не заметно, но нажатие w и s должно приводить к некоторому вращению. Вам может потребоваться изменить количество, которое имеет скорость xspeed и yspeed, чтобы заставить его вращаться быстрее/медленнее в зависимости от скорости вашего компьютера.
Ах, спасибо, теперь я чувствую, что, наверное, это узнал, когда я впервые добавил этот цикл. Я буду смотреть в GLFW. На самом деле этот проект (я удалил большую часть кода) находится на очень коротком временном интервале, и я уже пытался преобразовать наш код из WinAPI в freeglut, потому что мы действительно получаем наш первый опыт работы с opengl и окном управления и т. п. – Cerin