2012-03-03 2 views
1

Я работаю над получением ввода клавиатуры для работы в 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, чтобы заставить его вращаться быстрее/медленнее в зависимости от скорости вашего компьютера.

ответ

1

Что относительно этого для цикла вызывает желаемый эффект вращения, который, кажется, не происходит без него?

Это называется «инициализация ваших данных». Любая выделенная память не инициализируется (и поэтому содержит случайный мусор), если только у этого типа нет конструктора. И bool нет. Вы по умолчанию инициализируете этот массив bool, который даст им все значения мусора.

Ваша петля дает им все явное значение. А именно, false.

Правильный способ сделать то, что вы делаете это:

bool keyStates[256] = {false}; 

C++ не Java; вам не нужно динамически выделять все. Это создает статический массив из 256 bool элементов.Часть {false} инициализирует первую цифру false; по правилам C++ все остальные члены инициализируются инициализацией (отличной от инициализации по умолчанию). Инициализированное значение bool содержит false. Таким образом, это инициализирует все наши bool s.

Нет необходимости в цикле.

Кстати, вы можете рассмотреть возможность канавки FreeGLUT для GLFW. Он хранит правильный список ключевых состояний для вас, поэтому вам не нужно управлять им самостоятельно. Если вы делаете что-то подобное, вы, вероятно, создаете приложение, в котором вы столкнетесь с другими проблемами, используя FreeGLUT.

+0

Ах, спасибо, теперь я чувствую, что, наверное, это узнал, когда я впервые добавил этот цикл. Я буду смотреть в GLFW. На самом деле этот проект (я удалил большую часть кода) находится на очень коротком временном интервале, и я уже пытался преобразовать наш код из WinAPI в freeglut, потому что мы действительно получаем наш первый опыт работы с opengl и окном управления и т. п. – Cerin