2011-05-20 77 views
1

我的CCSprite子類有兩個名爲velX和velY的浮點屬性,用於跟蹤我的播放器的速度。當它在遊戲層中被滑動時,我計算出滑動的向量方向並啓動玩家移動。在我的遊戲層的-update:(ccTime)dt方法中,我打電話[player update:(ccTime)dt(我知道,同名),並且CCSprite類中的該方法具有此代碼。減少CCSprite速度時的奇怪行爲

// move 
    self.position = ccp(self.position.x + self.velX * dt, self.position.y + self.velY * dt); 
    // do edge checking 

// decelerate 
    #define kDeceleration .95 
    NSLog(@">velX = %1.1f, velY = %1.1f, fabs(velX) = %1.1f, fabs(velY) = %1.1f", self.velX, self.velY, fabs(velX), fabs(velY)); 
    self.velX *= kDeceleration; 
    if (fabs(self.velX < 1.0)) self.velX = 0.0; 
    self.velY *= kDeceleration; 
    if (fabs(self.velY < 1.0)) self.velY = 0.0; 

調用此方法每次比賽層調用update並通過在遊戲中循環使用,同時增加時間。

如果我向正方向滑動,它會很好用,但是如果其中一個滑動組件是負數(左或下),那麼它們會直接歸零。如果我拿出條件,一切都有效,我只是認爲乘以零應該比不斷乘以非常小的小數便宜。

我必須使用fabs()函數正確...

編輯:從兩個揮動一些示例輸出,一個正在兩個軸,和一個負在兩者。

>velX = 21.8, velY = 20.6, fabs(velX) = 21.8, fabs(velY) = 20.6 
>velX = 20.7, velY = 19.6, fabs(velX) = 20.7, fabs(velY) = 19.6 
>velX = 19.7, velY = 18.6, fabs(velX) = 19.7, fabs(velY) = 18.6 
>velX = 18.7, velY = 17.7, fabs(velX) = 18.7, fabs(velY) = 17.7 
>velX = 17.8, velY = 16.8, fabs(velX) = 17.8, fabs(velY) = 16.8 

>velX = -23.0, velY = -19.3, fabs(velX) = 23.0, fabs(velY) = 19.3 
>velX = 0.0, velY = 0.0, fabs(velX) = 0.0, fabs(velY) = 0.0 
>velX = 0.0, velY = 0.0, fabs(velX) = 0.0, fabs(velY) = 0.0 
>velX = 0.0, velY = 0.0, fabs(velX) = 0.0, fabs(velY) = 0.0 
>velX = 0.0, velY = 0.0, fabs(velX) = 0.0, fabs(velY) = 0.0 

回答

0

我相信這一塊是一個語法錯字:

self.velX *= kDeceleration; 
if (fabs(self.velX < 1.0)) self.velX = 0.0; 
self.velY *= kDeceleration; 
if (fabs(self.velY < 1.0)) self.velY = 0.0; 

它應該是這個:

self.velX *= kDeceleration; 
if (fabs(self.velX) < 1.0) self.velX = 0.0; 
self.velY *= kDeceleration; 
if (fabs(self.velY) < 1.0) self.velY = 0.0; 

所需要的比較操作之前關閉fabs括號

p/s:沒關係,所有人都會犯這種錯誤:)

+0

謝謝!我知道這是愚蠢的。現在我還在想,這兩個條件檢查是否需要更多的週期而不是不斷乘以小數?如果沒有,一旦.velX小於浮點數可以表示,反正它真的只是零? – Steve 2011-05-20 15:16:41