Проблемы с приостановкой OpenGL - PullRequest
0 голосов
/ 01 июля 2010

У меня есть следующая функция, которая используется как параметр функции glutKeyboardFunc:

void handleKeypress(unsigned char key, //The key that was pressed
                    int x, int y) {    //The current mouse coordinates
    switch (key) {
        case 27: //Escape key
            exit(0); //Exit the program
    }

    if (key == 'a')
    {
        moveCircleLeft(0);
    }
    if (key == 'w')
    {
        moveCircleUp(0);
    }
    if (key == 's')
    {
        moveCircleDown(0);
    }
    if (key == 'd')
    {
        moveCircleRight(0);
    }
}

Теперь я покажу вам moveCircleLeft в качестве примера написания функций moveCircle:

void moveCircleLeft(int x)
{
    characterX = characterX - 0.1;
    glutPostRedisplay();
    x++;
    if (x < 10)
    {
        glutTimerFunc(10, moveCircleLeft, x);
    }
}

Другие moveCircle функции работают аналогично, и единственное различие между четырьмя функциями заключается в том, является ли его плюс минус 0,1 или равен characterY в отличие от characterX.

Теперь вот проблема:

Все направления движутся в правильном направлении, но при попытке нажатия клавиш возникает задержка / пауза в движении персонажа. Поэтому, если я нажимаю только клавишу d (moveCircleRight), она немного перемещается вправо, останавливается на некоторое время, а затем перемещается по экрану в этом направлении с постоянной скоростью без пауз. Затем, если я переключаюсь на другую клавишу, она немного останавливается перед сменой направления, затем движется с постоянной скоростью в этом направлении.

Любое предложение по этому поводу будет оценено!

1 Ответ

1 голос
/ 01 июля 2010

Создайте переменную boolean для каждого ключа (предпочтительно массив).Затем используйте KeyDown/KeyUp вместо KeyPress (я верю в GLUT, что-то вроде KeyboardUpFunc и KeyboardFunc, но не могу вспомнить сейчас)На KeyDown установите для соответствующей переменной значение true, на KeyUp установите для нее значение false.Теперь у вас, вероятно, есть функция Idle или что-то в этом роде.Вызывайте там свои функции перемещения на основе логических переменных.Там не должно быть никаких пауз сейчас.Имейте в виду, что вам может понадобиться отслеживать время, прошедшее между кадрами, и масштабировать расстояние, перемещаемое соответствующим образом.

...