垂直运动公式

From Minecraft Parkour Wiki
Revision as of 15:03, 28 January 2022 by Pjx1314 (talk | contribs) (Created page with "*<math display="inline"> V\displaystyle _{Y,0}</math> 并没有被赋值,因为这无关紧要。按照惯例,第 0 tick 对应玩家跳跃前的初始速度。 *<math display="inline"> V\displaystyle _{Y,1}</math> 对应初始跳跃速度。每拥有一级跳跃提升这个值就增加 0.1。 *在 1.9 中跳跃高度略有提高,因为动量阈值被降低了(原来=1.249,现在=1.252)。 *终端速度为 -3.92 m/t *当...")
Other languages:


跳跃公式

可以简单地计算出玩家在一次跳跃过程中的垂直速度:


  • Failed to parse (syntax error): {\displaystyle V\displaystyle _{Y,t} = \left (V_{Y,t-1} - \underset{重力}{0.08} \right ) \times \underset{阻力}{0.98}}


如果,则会被设为 0(该 tick 玩家的高度不会改变)。

在 1.9+,这个阈值变为 0.003。


注意

  • 并没有被赋值,因为这无关紧要。按照惯例,第 0 tick 对应玩家跳跃前的初始速度。
  • 对应初始跳跃速度。每拥有一级跳跃提升这个值就增加 0.1。
  • 在 1.9 中跳跃高度略有提高,因为动量阈值被降低了(原来=1.249,现在=1.252)。
  • 终端速度为 -3.92 m/t
  • 当玩家与方块垂直碰撞时,垂直动量被取消,仅保留加速度。


Jump duration

The duration of a jump is the number of ticks between jumping and landing.
It also corresponds to the period of that jump's cycle when performed repeatedly.
This notion is linked to the notion of Tiers.
Description Duration
Flat Jump 12 t
3bc Jump 11 t
+0.5 Jump 10 t
+1 Jump 9 t
2.5bc Jump 6 t
2bc Jump 3 t
1.8125bc Jump 2 t


Source code

/* Code unrelated to vertical movement is cut out */
</div>

<div lang="en" dir="ltr" class="mw-content-ltr">
protected float getJumpUpwardsMotion(){
    return 0.42F;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
protected void jump()
{
    this.motionY = this.getJumpUpwardsMotion();
    if (this.isPotionActive(Potion.jump))
    {
        this.motionY += (this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F;
    }
    this.isAirBorne = true;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
public void moveEntityWithHeading(float strafe, float forward)
{
    ... /* also moves the player horizontally */
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
this.motionY -= 0.08;
    this.motionY *= 0.98;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
public void onLivingUpdate()
{
    if (this.jumpTicks > 0)
        --this.jumpTicks;
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
if (Math.abs(this.motionY) < 0.005D)
        this.motionY = 0.0D;
</div>


    <div lang="en" dir="ltr" class="mw-content-ltr">
if (this.isJumping)
    {
        ... /* different if in water or lava */
</div>

        <div lang="en" dir="ltr" class="mw-content-ltr">
if (this.onGround && this.jumpTicks == 0)
        {
            this.jump();
            this.jumpTicks = 10; //activate autojump cooldown (0.5s)
        }
    }
        
    else
    {
        this.jumpTicks = 0; //reset autojump cooldown
    }
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
...
    
    this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
}