备注:由于本人最近在学习box2d引擎,而中文资料中好的文章比较少,我就在google上找了一些英文资料。于是,发现了网上的Box2D tutorial系列文章,觉得写得挺好的,于是做了一些翻译和大家分享分享。由于这是我第一次翻译技术型文章,翻译不当的地方还请各位多理解。

下面我给出原文网址:http://www.iforce2d.net/b2dtut/jumping,本系列翻译文章仅用于学习交流之用,请勿用于商业用途。欢迎各位转载!

Jumping

一个平台游戏中的角色,会使用跳跃动作是必须的,让我们用不同的方法来实现jump。在力和冲量的主题中,我们已经做了这方面的工作,但现在我们会考虑怎样将每一个方法应用到游戏中去。一开始,我们使用含有围墙和左右键控制运动的物体的“匀速运动”这一节内容中的场景。

直接设置速度

当玩家角色跳跃时,它的速度会发生改变,我们现在就从这里开始吧!添加一个cased到Keyboard()函数中来获取用户的键盘输入:

case‘j’://jump

{

b2Vec2 vel= body->GetLinearVelocity();

vel.y=10;//upwards – don’t change x velocity

body->SetLinearVelocity( vel);

}

break;

现在通过“j”键,我们就可以直接设置物体的速度,但这个方法不能很好地模拟物理现象。有一些需要注意的事,关于这个方法可能不适合一个游戏中的jump动作。由于身体的惯性没有考虑在内,因此玩家可以等强度地跳跃,即使在快速下落时也可以。玩家同样可以像你所期望的那样在半空中跳跃,就是所谓的“二次跳跃“。现在我们开始着手解决这个半空中跳跃的特点,在接下来的主题,我们将看看如何判断玩家是否站在地面上。

使用力

在真实世界中,当你跳跃时,在你身上会有一个向下的力一直作用于在你身上。让我们看看如何在几个时间步内通过强大的力来实现这一现象。在Keyboard()函数中,我们会设置一个标记表示jump已经开始,然后再Step()中添加力作用于物体。在类中添加一个成员变量用于记录力需要多少个时间步:

//class member variable
  int remainingJumpSteps;
  
  //in constructor
  remainingJumpSteps = 0;
  
  //keyboard function
  case'k'://jump
    remainingJumpSteps = 6;// 1/10th of a second at 60Hz
    break;
  
  //in Step() function
  if ( remainingJumpSteps > 0 ) {
    body->ApplyForce( b2Vec2(0,500), body->GetWorldCenter() );
    remainingJumpSteps--;
  }

现在我们使用k键测试一下。运行效果和之前的很相像,但是这次当物体下降时,跳跃的效果就有所下降,这是因为存在一个作用于物体的惯性已经被纳入考虑。在这里力的大小只是一个数字看来似乎是对的。如果想指定跳起时的速度,尼克使用相同的公式以设定的速度来左右移动物体(f =mv/t),同时应用在所有的时间步中。

使用冲量

这个可能是你在大多数情况下最想要的,同样是和上面一样大小的力,但是仅仅在一个时间步内以显示出瞬时的效果。在之前的主题中,我们可以把时间设置成这样:

case'l':
  {
    //to change velocity by 10
    float impulse = body->GetMass() * 10;
    body->ApplyLinearImpulse( b2Vec2(0,impulse), body->GetWorldCenter() );
  }
  break;

这个给出了一个更接近于直接设置速度的行为,比用力来设置效果更相似,因为在每一个时间步内里都有力的作用,而重力就机会将物体拉回地面。如果你仔细的看,会发现用力来实现的跳跃高度没有其他方式的高。但是,如果你有一种情况下,你想想跳跃时看起来柔和一点,而不想人物好像被一个巨锤从物体下方击中,使用力的方式可能更有效。

其他方法

在现实世界中,每一个动作都有一个大小相等、方向相反的效果。例如你站在地上向上跳的一瞬间,地面也会受到一个大小相同的当方向向下的力作用。在上面的方法中,我们都没有把这一因素纳入考虑,在你的大部分游戏中,你都不会用到这一效果。但如果你想有这样的精确模拟的,你有两种方法可以做到这一点,这两个我们需要更多的研究。

在确定玩家已经站在某样支撑物上面,如果那个支撑物是dynamic body,那么你可以对支撑物施加同样的力或者是冲量。如果支撑物是摆动桥,那么效果会更好。例如摆动桥在玩家跳跃时会获得一个向下的踢的作用,而不是仅仅作用在摆动桥上的物体重量消失而已。为此我们需要知道如何告诉玩家什么时候是正在接触物体。

使用移动(滑动)和两个物体一起可能是最精确模拟物体跳跃的方法。在这个方法中,玩家会有一个main body(正如我们在游戏中使用的那样),还有一个较小的物体连接着它可以垂直地滑动。这个方法有一个优势,那就是我们没有必要去检查玩家是否站在任何东西上,因为如果玩家站在物体上,我们详细推动“legs”时不会什么事情都不发生,就想你在弯曲小腿向上跳时,你的上半身(main body)也会向下运动。同样的,我们同样会获得一个相反的力作用于我们脚下的物体,例如向下踢摆动桥。还有的是,如果玩家站在一个柔软的物体上面,如摆动桥,那么跳跃的效果会减弱,就和现实世界中的一样。当让,除了做更多的工作来实现,这个方法还是有一些自身的问题需要考虑。我希望在在讲完关节和关节驱动这一内容后,另外开一个主题继续讨论这一方法。

停止物体旋转

你可能注意到物体仍在自由旋转,要想停止物体旋转,一个推荐的方法是让物体作物一个固定的旋转体。

打赏

发表评论

电子邮件地址不会被公开。