OpenGL暂停问题

时间:2010-06-30 21:08:23

标签: c++ opengl glut

我有以下函数用作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 个答案:

答案 0 :(得分:1)

为每个键(最好是数组)创建一个boolean变量。然后使用KeyDown/KeyUp代替KeyPress(我相信GLUT类似于KeyboardUpFuncKeyboardFunc,但现在无法记住)。在KeyDown上,在KeyUp上将相应的变量设置为true,将其设置为false。现在你可能有一个Idle函数或类似的东西。根据布尔变量调用你的“移动”函数。现在应该没有停顿。请注意,您可能需要跟踪帧之间经过的时间并缩放适当移动的距离。