GLUT中的平滑运动

时间:2015-11-03 23:11:54

标签: c++ opengl glut glew

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

但是我以相当可怕的方式做了这个动作,我的意思是它基于这样的离散值:

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 个答案:

答案 0 :(得分:1)

你所追求的是加速(也可能是减速 - 让我在回答时考虑一下)。

要遵循的步骤如下:

  1. 你的马里奥站在x位置。将speed设置为0.0acceleration设置为较小的值,例如0.01
  2. 用户按键。将acceleration添加到speed并更新其排名。确保加速度具有正确的符号 - 向左移动为负,向右移动为正。
  3. 只要用户未释放密钥,请继续将acceleration添加到speed - 但只要speed达到合适的值(0.05,就会停止,例如)。
  4. 如果您希望Mario在释放密钥时滑动停止,请将acceleration设置为负值,例如-0.015(通常比加速时更多),并使用它降低速度,直到它小于或等于0.0。如果不是,请务必将其重置为完全 0.0!浮点运算是不准确的,剩余的非常小的值可能会让您的Mario继续轻微移动。
  5. 此程序与整个游戏循环的实际时间紧密相关。您需要在每个游戏框架中仅添加或减去acceleration一次 您可以使其可以使用可变更新间隔(即,根据两次连续speed更新之间的时间调整速度)但是更容易从固定帧开始速率,例如每秒25或50帧。那样acceleration可以是常数;可以通过试运行估算正确的值。我想你通过同样的过程最终得到了你的xx = xx + 0.05;

    相同的程序可用于"跳跃" "下降"。要跳转,请将初始速度设置为较高值,并在每个游戏循环中减小它。不要担心它是否低于0,这是必要的,以便再次下降。要降低速度,请将速度设置为0.0并再次使用acceleration增加速度。

    如果您的马里奥沿无限直线移动,这将正常工作。然后你只需要留意他的yy位置 - 它可能不会延伸到地板以下。如果您要添加不同的垂直水平以继续前进,您可以为左右移动(使其停止而不是滑动停止)以及上下移动(再次,死停止)添加碰撞检查如果他跳了起来,把头撞到了某个东西上,然后然后摔倒了,如果他走开了某个东西,就会越来越快,直到他撞到底部的一个街区。)