我的 CCSprite 子类有两个名为 velX 和 velY 的浮点属性来跟踪我的播放器的速度。当它在游戏层中滑动时,我会计算出滑动的矢量方向并开始玩家移动。在-update:(ccTime)dt
我的游戏层的方法中,我调用[player update:(ccTime)dt
(我知道,同名)并且 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