Проблемы с паузой OpenGL

У меня есть следующая функция, которая используется в качестве параметра функции 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), он немного перемещается вправо, останавливается на небольшой промежуток времени, а затем перемещается по экрану в этом направлении с постоянной скоростью без пауз. Затем, если я перехожу на другую клавишу, она делает небольшую паузу перед изменением направления, а затем движется с постоянной скоростью в этом направлении.

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


person Community    schedule 30.06.2010    source источник
comment
Почему вы используете переключатель для одного условия, а затем используете отдельные операторы if для всех остальных?   -  person Cogwheel    schedule 01.07.2010
comment
У меня было несколько аргументов для операторов if, а затем я избавился от них. Потом особо не заморачивался с заменой.   -  person    schedule 01.07.2010


Ответы (1)


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

person PeterK    schedule 30.06.2010
comment
Лично я просто установил какой-то переменной dt значение 1 / FRAMES_PER_SECOND (и, очевидно, где-то #define FRAMES_PER_SECOND). - person Platinum Azure; 01.07.2010