私の CCSprite サブクラスには、プレーヤーの速度を追跡するために、velX と velY という 2 つの float プロパティがあります。ゲーム レイヤーでスワイプされると、スワイプのベクトル方向を把握し、プレイヤーをその方向に動かします。-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()
関数を間違って使用している必要があります...
編集: 2 つのスワイプからのサンプル出力。1 つは両方の軸で正、もう 1 つは両方の軸で負です。
>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