1

私の 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
4

1 に答える 1

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: 大丈夫です、誰もがいつもこの種の間違いをします :)

于 2011-05-20T14:55:57.630 に答える