跳躍

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

跳躍是一個無須過多解釋的基本機制。


觸發

要開始跳躍,玩家必須在上一站在地面上。這就是為什麼玩家能夠從方塊上跑出去 1 刻(例如用延立),並且仍然能夠跳躍。

長按跳躍鍵時,玩家每 10 刻(0.5 秒)最多跳躍一次。

  • 當跳躍高度超過 0.75b 時,長按跳躍鍵不是最優的(手動按跳躍鍵會比長按速度更快)。
  • 鬆開跳躍鍵會重置冷卻時間,使玩家能夠在下一 tick 再次跳躍。

起跳時,玩家的垂直速度被設置為 0.42。在接下來的每一刻都會減少 0.08(重力),然後乘以 0.98(阻力)。

  • 當玩家頂到天花板時,其垂直速度被設置為0,並立即開始下落。
  • 當玩家碰到地面時,他們的垂直速度被設置為0,並且 onGround 判斷條件被設置為 true。
  • 水或熔岩中跳躍使玩家向上移動。


跳躍高度

在 1.9 之前,最大的跳躍高度為 1.249b。在 1.9 以上的版本中,它增加了約 0.003b,使玩家能夠跳到 1.252b 高。

在平地上,一個跳躍持續 12 。(0.6s)。


速度

當與 疾跑 結合時,跳躍會向玩家的方向增加 0.2 單位的加速度。

在空中,玩家加速的速度較慢(只有基本加速值的 20%),但卻能保存更多的速度(每刻 91%,而不是54.6%)。

因此,疾跑跳躍是一種非常有效的增加和保存速度的方法。


代碼

下面的代碼片段是關於如何觸發跳躍的。

/* 来自 EntityLivingBase.java,去掉了不相关的代码 */
public void onLivingUpdate()
{
    if (this.jumpTicks > 0)
        --this.jumpTicks;

    if (this.isJumping)
    {
        if (this.isInWater())
            this.handleJumpWater(); //motionY += 0.04

        else if (this.isInLava())
            this.handleJumpLava();  //motionY += 0.04

        else if (this.onGround && this.jumpTicks == 0)
        {
                this.jump();
                this.jumpTicks = 10;
        }
    }

    //松开跳跃键会重置 10 刻的冷却时间。
    else
        this.jumpTicks = 0;
}


/* 来自 EntityLivingBase.java */
protected void jump()
{
    this.motionY = 0.42; //初速度

    //应用跳跃提升
    if (this.isPotionActive(Potion.jump))
        this.motionY += (this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F

    //应用疾跑跳跃提升
    if (this.isSprinting())
    {
        float f = this.rotationYaw * 0.017453292F; //乘以 pi/180 转换为弧度
        this.motionX -= MathHelper.sin(f) * 0.2F;
        this.motionZ += MathHelper.cos(f) * 0.2F;
    }
}