나는 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 픽셀 씩 움직이기 때문에 문제가됩니다.
어떻게이 작업에 대해 더 정확한 계산을 할 수 있습니까?
여기에서 연구를 시작하십시오 : [JavaScript 부동 소수점 문제에 대한 우아한 해결 방법] (0120-13756) –
나는 속도를 줄이기위한 "지수 감소"접근 방식의 팬입니다. 나는'if's의 첫 블록을'this.xv * = 0.9; this.yv * = 0.9;'(또는 어떤 요인이 "가장 좋았는지"). 반올림 오류 후에도 속도가 제로 부근에서 진동하는 문제는 피할 수 있습니다. –
@XavierHolt : 실제로 대부분 문제가 해결되었습니다. 나는 여전히'-0.000021784715049668016'과 같은 숫자로 끝나고 있지만, 제 목적을 위해서는 괜찮습니다. 단지 스프라이트가 눈에 띄게 "들어온다"는 것을 피하고 싶었습니다. 이것을 답변으로 추가하면 동의 할 것입니다. –