2013-02-19 3 views
0

나는 JavaScript를 기반으로하는 캔버스 요소를 사용하여 게임을 만들고 있습니다. 플레이어 클래스의 일부에는 진드기당 한 번 호출되는 update() 메서드가 포함되어 있습니다. 이 방법에서는 키보드 입력을 기반으로 플레이어 속도를 업데이트하고 플레이어를 움직이기 위해 몇 가지 수학을 수행합니다. 여기에 그 코드의 덩어리가있다 :더 정확한 플로트 계산하기

플레이어가 아래로 보유하고있는 경우 이론적으로는 이제
// Gradually make the players velocity 0 
if(this.xv > 0) { 
    this.xv -= 0.1; 
} else if(this.xv < 0) { 
    this.xv += 0.1; 
} 
if(this.yv > 0) { 
    this.yv -= 0.1; 
} else if(this.yv < 0) { 
    this.yv += 0.1; 
} 

// Update player position based on velocity 
this.x += this.xv; 
this.y += this.yv; 

// Update velocity based on keyboard inputs 
if(keyState[87]) { 
    this.yv -= 0.5; 
} 
if(keyState[65]) { 
    this.xv -= 0.5; 
} 
if(keyState[83]) { 
    this.yv += 0.5; 
} 
if(keyState[68]) { 
    this.xv += 0.5; 
} 

이 모든 작업 괜찮아요, 4 W 키는 속도가 2 될 것 진드기해야하고 이후 40 개는 속도가 될 것입니다 틱 0으로 줄었습니다.

부동 소수점 숫자로 작업 할 때 JavaScript가 완전히 정확하지 않은 것처럼 실제로는 작동하지 않습니다. 하나는 자바 스크립트 좋은 정밀도와 속도를 계산하지 않을 것입니다,

x: -1.0241807402167069e-14   y: -1.379452108096757e-14 
x: 0.09999999999998976   y: 0.09999999999998621 
x: -1.0241807402167069e-14   y: -1.379452108096757e-14 
x: 0.09999999999998976   y: 0.09999999999998621 

그래서 잘못된 것은 이쪽을 봐 두 가지가있다, 다른 하나는 때이다 : 나는 속도 변수를 각 게임 틱 console.log() 경우 I 출력의이 종류를 얻을 속도는 음수입니다. 항상 적어도 -1입니다. 플레이어 스프라이트가 틱당 1 픽셀 씩 움직이기 때문에 문제가됩니다.

어떻게이 작업에 대해 더 정확한 계산을 할 수 있습니까?

+0

여기에서 연구를 시작하십시오 : [JavaScript 부동 소수점 문제에 대한 우아한 해결 방법] (0120-13756) –

+0

나는 속도를 줄이기위한 "지수 감소"접근 방식의 팬입니다. 나는'if's의 첫 블록을'this.xv * = 0.9; this.yv * = 0.9;'(또는 어떤 요인이 "가장 좋았는지"). 반올림 오류 후에도 속도가 제로 부근에서 진동하는 문제는 피할 수 있습니다. –

+0

@XavierHolt : 실제로 대부분 문제가 해결되었습니다. 나는 여전히'-0.000021784715049668016'과 같은 숫자로 끝나고 있지만, 제 목적을 위해서는 괜찮습니다. 단지 스프라이트가 눈에 띄게 "들어온다"는 것을 피하고 싶었습니다. 이것을 답변으로 추가하면 동의 할 것입니다. –

답변

1

"exponential decay"접근법을 사용하여 속도 전환을 부드럽게하는 것이 좋습니다. 대신 현재 제로로 속도를 줄이기 위해 사용하는 조건 블록으로, 나는 다음과 같은 사용하십시오 :이 10 배를 일정한 가속도 최대 속도를 캡 것을

this.xv *= 0.9; 
this.yv *= 0.9; 

참고, 그 붕괴의 속도를 변경 그 배율을 바꿀거야. 이 괜찮을 수도 있지만, 그렇지 않은 경우는 목표 속도로 완화하기 위해 방정식을 조정할 수 있습니다

var p = 0.9; 
var q = 1.0 - p; 
this.xv = this.xv * p + this.txv * q; 
this.yv = this.yv * p + this.tyv * q; 

면책 조항 :이 뉴턴 물리학에서 실제 근거가 없다 로봇에서 상태 전환을 부드럽게하는 데 도움이되는 것입니다. 그러나 그것은 나에게 위대하고 잘하면 당신을 위해 할 것입니다.

관련 문제