45 Strafe/ja: Difference between revisions

From Minecraft Parkour Wiki
Content added Content deleted
(Updating to match new version of source page)
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 38: Line 38:
* strafe入力ありの場合、得られる加速度は<math>0.98 \sqrt{2}</math>(≒ 1.386)倍になる。
* strafe入力ありの場合、得られる加速度は<math>0.98 \sqrt{2}</math>(≒ 1.386)倍になる。


45°スニークは助走なしジャンプに使用される([https://youtu.be/XKCQiN76W3Y 例])。
<div class="mw-translate-fuzzy">
45°スニークは助走なしジャンプに使用される([https://youtu.be/k1prrr7P5M4 例])。
</div>


通常のスニークよりも約41%速いため、bridgingなどアスレチック以外でも使用されている。
通常のスニークよりも約41%速いため、bridgingなどアスレチック以外でも使用されている。
Line 80: Line 78:
if (this.onGround)
if (this.onGround)
{
{
/* プレイヤーの1b下のブロックのslipperinessを取得 */
/* プレイヤーの1b下のブロックの滑りやすさを取得 */
mult *= getBlockSlipperinessAt(this.posX, this.getEntityBoundingBox().minY - 1, this.posZ);
mult *= getBlockSlipperinessAt(this.posX, this.getEntityBoundingBox().minY - 1, this.posZ);
}
}


/* 加速度 = (0.6*0.91)^3 / (slipperiness*0.91)^3) */
/* 加速度 = (0.6*0.91)^3 / (滑りやすさ*0.91)^3) */
float acceleration = 0.16277136F / (mult * mult * mult);
float acceleration = 0.16277136F / (mult * mult * mult);



Latest revision as of 11:12, 23 August 2022

Other languages:

45° Strafeとは、通常よりも高い速度を得られる技術である。

前進キーとstrafeキーを入力し、45°方向を向くことで実行できる(名前の由来はそこから)。


45° Strafeは以下のどちらでも可能:

  • 左45°に振り向き、右Strafeキーを入力。
  • 右45°に振り向き、左Strafeキーを入力。


振り向きは素早く(1tick以内)かつ正確(誤差最大±11.5°、±0°に近いほど良い)でなければならないため、安定して実行するのは難しい。

1bm 4.375bなど、45° strafeが必須のジャンプも存在する。



動きへの影響

毎tick、プレイヤーはキー入力などの要素に基づいた加速度を得る。

  • 正面に(strafe入力なしで)動いている場合、得られる加速度は倍になる。
  • strafe入力ありの場合、加速度は倍になる。

よって、45° Strafeは通常の移動方法よりも倍(約2%)速い。


特殊なケース: 45°スニーク

  • 正面に(strafe入力なしで)スニークしている場合、得られる加速度は倍になる。
  • strafe入力ありの場合、得られる加速度は(≒ 1.386)倍になる。

45°スニークは助走なしジャンプに使用される()。

通常のスニークよりも約41%速いため、bridgingなどアスレチック以外でも使用されている。



解説

以下は水平方向の移動に関するソースコードを簡略化したもの。

/* 
 * EntityとEntityLivingBaseのソースコード
 * 不要、無関係な部分は削除済
 */

public void onLivingUpdate()
{
    /* 
     * moveStrafingとmoveForwardは相対的な動きを表す。
     * moveStrafing = 左に動いている場合1.0、右に動いている場合-1.0、それ以外は0.0。
     * moveForward = 前に動いている場合1.0、後ろに動いている場合-1.0、それ以外は0.0。
     *
     * 更に、スニークしている場合、moveStrafingとmoveForward *= 0.3。
     */

    this.moveStrafing *= 0.98F;
    this.moveForward *= 0.98F;
    this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
}



public void moveEntityWithHeading(float strafe, float forward)
{
    /* 次tickに保持される速度は慣性によって決定される */
    float mult = 0.91F;
    if (this.onGround)
    {
        /* プレイヤーの1b下のブロックの滑りやすさを取得 */
        mult *= getBlockSlipperinessAt(this.posX, this.getEntityBoundingBox().minY - 1, this.posZ);
    }

    /* 加速度 = (0.6*0.91)^3 / (滑りやすさ*0.91)^3) */
    float acceleration = 0.16277136F / (mult * mult * mult);

    float movementFactor;
    if (this.onGround)
        movementFactor = this.landMovementFactor * acceleration;
        /* 基本加速度: 0.1; ダッシュしている場合x1.3で、ステータス効果の影響を受ける。 */

    else
        movementFactor = this.airMovementFactor; 
        /* 基本加速度: 0.02; ダッシュしている場合x1.3。 */

    this.updateMotionXZ(strafe, forward, movementFactor); 
    this.moveEntity(this.motionX, this.motionY, this.motionZ);

    this.motionY -= 0.08D; /* 重力 */
    this.motionY *= 0.98D; /* 抗力 */

    this.motionX *= mult;
    this.motionZ *= mult;
}



public void updateMotionXZ(float strafe, float forward, float movementFactor)
{
    /*
     * この関数が45° strafeが存在する原因。この世界では幾何学には何の意味もない……。
     * 注:
     *     - ダッシュの倍率は「movementFactor」の中。
     *     - スニークの倍率は「strafe」と「forward」の中。
     * これは、スニークがダッシュより遥か以前に実装されたためと思われる。
     */
    float distance = strafe * strafe + forward * forward;

    if (distance >= 1.0E-4F)
    {
        distance = MathHelper.sqrt_float(distance);
            
        if (distance < 1.0F)
            distance = 1.0F;

        distance = movementFactor / distance;
        strafe = strafe * distance;
        forward = forward * distance;
        float sinYaw = MathHelper.sin(this.rotationYaw * Math.PI / 180.0F);
        float cosYaw = MathHelper.cos(this.rotationYaw * Math.PI / 180.0F);
        this.motionX += strafe * cosYaw - forward * sinYaw;
        this.motionZ += forward * cosYaw + strafe * sinYaw;
    }
}