我有以下函数用作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),它会向右移动一点,停止一小段时间,然后以恒定的速度在屏幕上移动,没有暂停。然后,如果我换到另一个键,它会在改变方向之前暂停一点,然后朝那个方向以恒定速度移动。
有任何关于此的建议将不胜感激!
答案 0 :(得分:1)
为每个键(最好是数组)创建一个boolean
变量。然后使用KeyDown/KeyUp
代替KeyPress
(我相信GLUT类似于KeyboardUpFunc
和KeyboardFunc
,但现在无法记住)。在KeyDown
上,在KeyUp
上将相应的变量设置为true,将其设置为false。现在你可能有一个Idle
函数或类似的东西。根据布尔变量调用你的“移动”函数。现在应该没有停顿。请注意,您可能需要跟踪帧之间经过的时间并缩放适当移动的距离。