2017-02-23 9 views
0

그래서 내 선수는 딱딱한 움직임을 원합니다. 내가 diagnolly 이동하고있어 플레이어가 더 빠른 최대 속도보다 이동하면 지금 내 코드는대각선 운동에서 Box2d 정적 속도가 더 빨라졌습니다.

move() { 
    var vel = this.body.GetLinearVelocity() 

    if(!this.pressingDown && !this.pressingUp){ 
     vel.y = 0; 
    } 
    if(!this.pressingRight && !this.pressingRight){ 
     vel.x = 0; 
    } 

    if(this.pressingDown){ 
     vel.y = this.speed; 
    } 
    if(this.pressingUp){ 
     vel.y = -this.speed; 

    } 
    if(this.pressingRight){ 
     vel.x = this.speed; 

    } 

    if(this.pressingLeft){ 
     vel.x = -this.speed 
    } 
    this.body.SetLinearVelocity(vel) 

처럼 보이는 이것은 작동하지만. 이 문제를 어떻게 해결할 수 있습니까?

답변

0

방향성 단위 벡터를 결정한 다음 this.speed을 곱합니다. 그런 식으로 속도의 크기는 항상 this.speed입니다. 그렇지 않은 경우, 발견 한대로 속도는 이 아닌 this.speed이 될 수 있습니다.

방향성 단위 벡터를 결정하는 방법은 누른 키를 기준으로 이동하려는 각도를 인식 한 다음 그 각도에 대한 사인 값과 코사인 값을 얻는 것입니다. 따라서 this.pressingRight 일 때 각도는 0입니다. this.pressingUp 일 때 각도는 90도 (또는 Pi/2 라디안)입니다. 또는 this.pressingUp && this.pressingRight 일 때 각도는 45도 (Pi/4 라디안)입니다. 모든 서비스 가능한 조합에 대해 if 문을 완료하면됩니다. 아마도 getAngleInRadiansForKeyPresses과 같은 자체 함수에 넣을 수도 있습니다.

move() { 
    var angle = getAngleInRadiansForKeyPresses(); 
    var vel = new b2Vec2(Math.cos(angle) * this.speed, Math.sin(angle) * this.speed); 
    this.body.SetLinearVelocity(vel); 
} 
:

(의사 자바 스크립트 코드에서) 구현은 다음과 같이 보일 수 있습니다