GLUT中的平滑移动

Smooth movement in GLUT

本文关键字:移动 平滑 GLUT      更新时间:2023-10-16

我制作了一个非常简单的引擎,基本上可以绘制一个字符,然后可以在屏幕上移动它。

但我以一种非常可怕的方式进行了这场运动,我的意思是,它是基于这样的离散值:

void Scene::movePlayer(int dir) {
    switch (dir){
    case 1:     yy = yy + 0.05;
            break;
    case 2:     xx = xx - 0.05;
            break;
    case 3:
            yy = yy - 0.05;
            break;
    case 4:
            xx = xx + 0.05;
            break;
    default:
            break;
}

它起作用并移动角色,但我真的不喜欢它,因为它很跳跃,而且不流畅。

我希望有更流畅的动作,就像在马里奥或类似的动作。

你能告诉我如何做到这一点吗?

你想要的是加速度(也许还有减速——让我在回答时考虑一下)。

要遵循的步骤如下:

  1. 你的马里奥在x位置静止不动。将speed设置为0.0,将acceleration设置为较小的值,例如0.01
  2. 用户按下
  3. 只要用户不释放密钥,就继续将acceleration添加到speed中,但一旦speed达到合适的值(例如0.05),就停止
  4. 如果您希望Mario在松开键时滑动到停止,请将acceleration设置为负值,如-0.015(通常大于加速时),并使用它来降低速度,直到其小于或等于0.0。当它较少时,请确保将其重置为,精确地0.0!浮点运算是不准确的,一个非常小的剩余值可能会让你的马里奥保持轻微的移动

此过程与整个游戏循环的实际时间密切相关。每个游戏帧只需要添加或减去acceleration一次
可以使用可变的更新间隔(即,根据两次连续speed更新之间的时间调整速度),但从固定帧速率开始更容易,例如每秒25或50帧。这样CCD_ 18可以是恒定的;可以通过试运行来估计正确的值。我想你在同样的过程中得到了xx = xx + 0.05;

同样的程序可以用于"跳跃"answers"坠落"。要跳跃,请将初始速度设置为一个高值,并在每个游戏循环中降低它。如果它低于0,不要担心,那是有必要让上涨的东西再次下跌。若要下降,请将速度设置为0.0,然后再次使用acceleration增加速度。

如果你的马里奥沿着一条无限的直线移动,这会很好。然后你只需要关注他的yy位置——它可能不会延伸到"地板"以下。如果你要添加不同的垂直水平来继续移动,你可以添加一个碰撞检查,用于向左和向右移动(使其完全停止,而不是滑动到停止)和向上和向下移动(同样,如果他跳起来并将头撞到什么东西上,则为完全停止,但随后是"摔倒",如果他离开什么东西,则增加速度,直到他撞到底部的块)。