감속을 어떻게 구현합니까?


11

나는 현재 가속을 사용하지 않기 때문에 "감속"이라고 말합니다. 내가 의미하는 것은 속도를 다시 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을 사용했습니다. 속도를 올렸다면 변경해야한다고 생각합니다.


2
또한 작은 의미 세부 .. 문에 velocity.i += speed;speed사실 즉, 속도가 변화하는 속도 당신의 가속이다. :)
Ipsquiggle

Flixel은 가속과 무관 한 용어를 찾고있는 경우이를 "끌기"라고합니다.
Gregory Avery-Weir

"감속"은 음의 가속입니다. 미적분학을 했습니까?
3Dave

1
실제로 "감속"은 실제가 아니며 "음의 가속"도 아닙니다. 그것은 단지 다른 방향으로 모든 규칙적인 가속입니다.
MichaelHouse

답변:


16

간단한 것

this.velocity.i *= 0.9;

잘 작동합니다.


훗, 지나치게 복잡한 그것에 신뢰 나 나쁜. 최근에 0.9를 곱하여 기본 공기 저항을 시뮬레이션 할 수 있지만 여전히 마음에 들지 않는다는 것을 읽었습니다. 감사합니다.
Xavura

ㅎㅎㅎ 나는 역 벡터 법선을 계산하고 그것을 감속 계수로 곱하고있었습니다. 내가 왜 이러지 않았어? 때로는 가장 분명한 답변이 놓치기 가장 쉬운 경우가 있습니다.
CodexArcanum

7

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

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

어디:

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

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


1
그것은 매우 흥미로운 공식입니다. 나는 미래를 위해 그것을 명심해야 할 것이다!
Ipsquiggle

+1 흥미로워 보입니다. 작동하는 것을보기 위해 코드에 넣을 수도 있습니다.
David Young

아주 좋은 공식. 나는 이것을 사용할 것입니다. 어디서 구했습니까? 아니면 스스로 파생 시켰습니까?
Riki

응답이 지연되어 죄송합니다. Blitz3D 데모 중 하나의 코드에서 영감을 얻은 것을 막연히 기억합니다. 어느 것을 기억할 수 없습니다.
earok

3

여기의 대답 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. 감쇠 :

찬성 :

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

단점 :

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

1

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

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으로 설정해야합니다.


나는 또한 수표를 제자리에 두어야 할 것이라고 생각했지만, 하나도 없으면 작동하는 것 같습니다.
Xavura
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.