2011-05-20 4 views
1

Ma sous-classe CCSprite possède deux propriétés flottantes appelées velX et velY pour garder une trace de la vélocité de mon lecteur. Quand il est glissé dans la couche de jeu, je détermine la direction du vecteur du balayage et commence le mouvement du joueur de cette façon. Dans la méthode -update:(ccTime)dt de ma couche de jeu, j'appelle [player update:(ccTime)dt (je sais, même nom) et cette méthode dans la classe CCSprite a ce code.Comportement impair lors de la décrémentation d'une vélocité 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; 

C'est appelé à chaque fois que la couche de jeu appelle update et passe dans le même incrément de temps que la boucle de jeu utilise.

Cela fonctionne très bien si je balaye dans une direction positive, mais si l'un des composants de balayage est négatif (gauche ou vers le bas), ils vont directement à zéro. Si je sors les conditions, tout fonctionne, je me suis dit que multiplier par zéro devrait être moins cher que de multiplier constamment par de très petites décimales.

I doit utiliser la fonction fabs() incorrectement ...

EDIT: Certaines sortie d'échantillon à partir de deux balayages, une positive dans les deux axes, et une négative dans les deux.

>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 

Répondre

0

Je crois que ce bloc est une erreur de syntaxe:

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; 

Il devrait être plutôt:

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; 

Vous devez fermer les fabs entre parenthèses avant que l'opérateur de comparaison

p/s: c'est bon, tout le monde fait ce genre d'erreur tout le temps :)

+0

Merci! Je savais que c'était quelque chose de stupide comme ça. Maintenant, je me demande, ces deux contrôles conditionnels prennent plus de cycles que de multiplier constamment par de petites décimales? Et sinon, une fois que .velX est devenu plus petit qu'un flotteur peut représenter, est-ce vraiment juste zéro? – Steve

Questions connexes