【问题标题】:OpenGL pausing problemsOpenGL暂停问题
【发布时间】:2010-07-01 05:53:41
【问题描述】:

我有以下函数用作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),它会向右移动一点,停止 a 一小段时间,然后以恒定速度在屏幕上移动,没有停顿。然后,如果我换一个不同的键,它会在改变方向之前暂停一点,然后以恒定的速度朝那个方向移动。

对此的任何建议将不胜感激!

【问题讨论】:

  • 为什么要对单个条件使用 switch,然后对所有其他条件使用单独的 if 语句?
  • 我确实有多个 if 语句的参数,然后去掉了它们。然后我并没有真正费心把它改回来。

标签: c++ opengl glut


【解决方案1】:

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

【讨论】:

  • 就我个人而言,我只是将某种dt 变量设置为1 / FRAMES_PER_SECOND(显然是#define FRAMES_PER_SECOND 某处)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多