2013-02-19 126 views
0

我正在使用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個像素移動。

如何爲此任務獲得更準確的計算結果?

+0

從這裏開始您的研究:[用於JavaScript浮點數問題的優雅解決方法](http://stackoverflow.com/a/3439981/612202) – 2013-02-19 21:03:57

+0

我是「指數衰減」方法的放大粉絲;我會用'this.xv * = 0.9替換你的第一個if塊; this.yv * = 0.9;'(或任何因素「感覺」最好)。避免舍入誤差後速度在零附近振盪的問題。 – 2013-02-19 21:06:38

+0

@XavierHolt:實際上大多解決了這個問題。我仍然以'-0.000021784715049668016'這樣的數字結束,但爲了我的目的,這很好,我只是想避免這個精靈顯着地「爬行」。如果您將此添加爲答案,我會接受它。 – 2013-02-19 21:10:10

回答

1

我推薦使用「指數衰減」方法來平滑你的速度轉換。相反,你目前使用的速度降低到零的條件塊的,我會用以下內容:

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; 

免責聲明:這在牛頓物理學沒有真正的依據;這只是我想出來的,以幫助消除機器人中的狀態轉換。但它對我很好,也希望能爲你服務。