감속을 어떻게 구현합니까? 현재 가속을 사용하지 않기 때문에 “감속”이라고

나는 현재 가속을 사용하지 않기 때문에 “감속”이라고 말합니다. 내가 의미하는 것은 속도를 다시 0으로 옮기고 결국 멈추는 것입니다.

나는 벡터에 익숙하지 않으며 물리학에 그리 좋지 않습니다. “감속”은 일반적으로 어떻게 처리됩니까?


내가 지금 가지고있는 것은 작동하지만 해킹 처럼 보입니다 .

update:function(Game, t, dt) {
    var speed = Game.Input.isKeyDown('shift') ? 8 : 4;

    if (Game.Input.isKeyDown('a')) {
        this.velocity.i -= speed;
    }
    else if (Game.Input.isKeyDown('d')) {
        this.velocity.i += speed;
    }
    else {
        if (Math.abs(this.velocity.i) > 3) {
            this.velocity.i += (this.velocity.i > 0) ? -speed : speed;
        }
        else {
            this.velocity.i = 0;
        }
    }

    if (Game.Input.isKeyDown('w')) {
        this.velocity.j -= speed;
    }
    else if (Game.Input.isKeyDown('s')) {
        this.velocity.j += speed;
    }
    else {
        if (Math.abs(this.velocity.j) > 3) {
            this.velocity.j += (this.velocity.j > 0) ? -speed : speed;
        }
        else {
            this.velocity.j = 0;
        }
    }

    this.updateVectors(dt);
}

낮은 것이 이상한 행동을 보이기 때문에 3을 사용했습니다. 속도를 올렸다면 변경해야한다고 생각합니다.



답변

간단한 것

this.velocity.i *= 0.9;

잘 작동합니다.


답변

의사 코드에서는 다음과 같이 변형합니다.

속도 + = (((MoveDirection * MaximumSpeed)-Speed) * AccelerationFactor

어디:

  • 속도는 엔티티가 현재 축에서 이동하는 현재 속도입니다.
  • MoveDirection은 엔티티가 현재 축에서 이동하려고하는 방향이며, 1은 앞으로, 0은 여전히, -1은 뒤로입니다. 사이의 모든 값이 허용됩니다.
  • MaximumSpeed는 엔터티가 현재 축을 가장 빠르게 이동할 수있는 속도를 결정하는 상수입니다.
  • AccelerationFactor는 가속과 감속의 비율을 나타내는 0과 1 사이의 상수입니다. 1은 즉각적이며 0은 절대 움직이지 않습니다.

선이 아닌 곡선으로 가속과 감속을 모두 잘 처리 합니다 . 다른 가속 및 감속 속도를 원하는 경우 플레이어가 반대 방향으로 움직이거나 움직이지 않는지를 결정하는 IF 문을 수행 할 수 있습니다.


답변

여기의 대답 vel = vel * 0.9은 실제로 ‘감속’으로 생각하지 않는 감쇠 입니다.

나는 종종 다음과 같이 감속합니다.

if ( Game.Input.isKeyDown( "w" ) )
{
    this.velocity.i = Math.max( -WALKSPEED, this.velocity.i - WALKFORCE);
}
else if ( Game.Input.isKeyDown( "d" ) )
{
    this.velocity.i = Math.min( WALKSPEED, this.velocity.i + WALKFORCE);
}
else
{
    if (this.velocity.i < 0)
    {
        this.velocity.i = Math.min( 0, this.velocity.i + WALKFORCE);
    }
    else if (this.velocity.i > 0)
    {
        this.velocity.i = Math.max( 0, this.velocity.i - WALKFORCE);
    }
}

일부 장단점 vs. 감쇠 :

찬성 :

  • 가속 가속과 감속 가속은 모두 선형이므로 댐핑이 제공하지 않는 유쾌한 미묘한 ‘게임 느낌’을 제공합니다. 이것이 중요한 부분입니다.
  • 캐릭터는 예측 가능한 반복 횟수 후에 예측 가능한 완전 정지에 도달합니다.

단점 :

  • 직교가 아닌 모션을 사용하는 경우 구현하기가 더 까다 롭습니다 (사운드처럼 들리나요?) 기본적으로 속도와 정렬 된 길이, 길이를 비교하고 적절한 값을 빼거나 빼는 힘 벡터를 가져와야합니다. (코드로 설명하고 싶다면 물어보십시오.)

답변

의사 코드로 간단히 말하면 다음과 같습니다.

if(no movement keys pressed) [Meaning we want to start to decelerate]
current speed *= 0.85 [Or some number between 0 and 1, the smaller the faster the deceleration]

그러나 (현재 속도 <0.001f) 또는 무언가를 확인하고 0으로 설정해야합니다.