垂直運動公式

From Minecraft Parkour Wiki
This page is a translated version of the page Vertical Movement Formulas and the translation is 100% complete.
Other languages:


跳躍公式

玩家在跳躍過程中的垂直速度非常容易計算:



如果,則會被設為 0(該刻玩家的高度不會改變)。

在 1.9+,這個閾值變為 0.003。


注意

  • 並沒有被賦值,因為它並不重要。按照慣例,第 0 刻對應玩家跳躍前的初始速度。
  • 對應初始跳躍速度。每擁有一級跳躍提升就增加 0.1。
  • 由於動量閾值降低,1.9 版本的跳躍高度略高(舊=1.249,新=1.252)。
  • 極限速度為 -3.92 m/t。
  • 當玩家與方塊垂直碰撞時,垂直動量被取消,僅保留加速度。


跳躍持續時間

跳躍的持續時間是起跳與落地之間刻的數量。
重複跳躍時,這也代表此類跳躍的循環周期。
這個概念與 Tiers(階)的概念有關。
介紹 持續時間
平地跳躍 12 t
3bc 跳躍 11 t
+0.5 跳跃 10 t
+1 跳躍 9 t
2.5bc 跳躍 6 t
2bc 跳躍 3 t
1.8125bc 跳躍 2 t


源代碼

摘自 EntityLivingBase

/* 与垂直运动不相关的代码已被删去 */

protected float getJumpUpwardsMotion(){
    return 0.42F;
}


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;
}


public void moveEntityWithHeading(float strafe, float forward)
{
    ... /* 同时水平移动玩家 */

    this.motionY -= 0.08;
    this.motionY *= 0.98;
}


public void onLivingUpdate()
{
    if (this.jumpTicks > 0)
        --this.jumpTicks;

    if (Math.abs(this.motionY) < 0.005D)
        this.motionY = 0.0D;


    if (this.isJumping)
    {
        ... /* 在水中或熔岩中时有所不同 */

        if (this.onGround && this.jumpTicks == 0)
        {
            this.jump();
            this.jumpTicks = 10; //激活自动跳跃冷却(0.5秒)
        }
    }
        
    else
    {
        this.jumpTicks = 0; //重置自动跳跃冷却
    }

    ...
    
    this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
}