Странное поведение при уменьшении скорости CCSprite - PullRequest
1 голос
/ 20 мая 2011

Мой подкласс 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

1 Ответ

0 голосов
/ 20 мая 2011

Я считаю, что этот блок является синтаксической опечаткой:

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: все в порядке, все постоянно совершают подобные ошибки:)

...