我正在使用JavaScript支持的canvas元素構建遊戲。我的球員類的一部分包括一個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在處理浮點數時似乎並不完全準確。如果我console.log()
速度變量每場比賽蜱我得到這樣的輸出:
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
因此,有是錯在這裏看兩個東西,一個是JavaScript的從未計算精度良好的速度,另一個是當速度是負的,它始終至少爲-1
,這是一個問題,因爲玩家精靈現在將以每個打勾1個像素移動。
如何爲此任務獲得更準確的計算結果?
從這裏開始您的研究:[用於JavaScript浮點數問題的優雅解決方法](http://stackoverflow.com/a/3439981/612202) – 2013-02-19 21:03:57
我是「指數衰減」方法的放大粉絲;我會用'this.xv * = 0.9替換你的第一個if塊; this.yv * = 0.9;'(或任何因素「感覺」最好)。避免舍入誤差後速度在零附近振盪的問題。 – 2013-02-19 21:06:38
@XavierHolt:實際上大多解決了這個問題。我仍然以'-0.000021784715049668016'這樣的數字結束,但爲了我的目的,這很好,我只是想避免這個精靈顯着地「爬行」。如果您將此添加爲答案,我會接受它。 – 2013-02-19 21:10:10