跳躍
跳躍是一個無須過多解釋的基本機制。
觸發
要開始跳躍,玩家必須在上一刻站在地面上。這就是為什麼玩家能夠從方塊上跑出去 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;
}
}