2010-03-28 26 views
2

J'ai un mouvement saccadé de mon sprite.déplacer un sprite provoque un mouvement saccadé

Fondamentalement, lorsque l'utilisateur touche un point sur l'écran, l'image-objet doit se déplacer à ce point. Cela fonctionne principalement bien ... il prend même en compte un delta - parce que le taux de trame peut ne pas être cohérent. Cependant, je remarque que le mouvement y finit habituellement avant le mouvement x (même lorsque les distances à parcourir sont les mêmes), il semble donc que l'image-objet se déplace en forme de «L» plutôt que de diagonale lisse .

Les vitesses verticales et horizontales (vx, vy) sont toutes les deux fixées à 300. Quelles sont les idées qui ne vont pas? Comment puis-je obtenir que mon sprite se déplace dans une ligne diagonale lisse?

- (void)update:(ccTime)dt 
{ 
int x = self.position.x; 
int y = self.position.y; 

    //if ball is to the left of target point 
if (x<targetx) 
{ 
      //if movement of the ball won't take it to it's target position 
    if (x+(vx *dt) < targetx) 
    { 
     x += vx * dt; 
    } 
    else { 
     x = targetx; 
    } 

} else if (x>targetx) //same with x being too far to the right 
{ 
    if (x-(vx *dt) > targetx) 
    { 
     x -= vx * dt; 
    } 
    else { 
     x = targetx; 
    } 

} 
if (y<targety) 
{ 
    if (y+(vy*dt)<targety) 
    { 
     y += vy * dt; 
    } 
    else { 
     y = targety; 
    } 

} else if (y>targety) 
{ 
    if (y-(vy*dt)>targety) 
    { 
     y -= vy * dt; 
    } 
    else { 
     y = targety; 
    } 

} 
self.position = ccp(x,y); 
} 

Répondre

2

Vous voulez passer à (targetx, targetY) de tout (x, y) et arriver à deux coordonnées en même temps (pour éviter le "dogleg"). Donc, supposons que la vitesse x est vx et que vous y arrivez en t secondes. Cela signifie vx = (targetx - x)/t. t doit être la même pour la coordonnée y si vous voulez un mouvement régulier au même point en même temps, ce qui signifie que t = (targetx - x)/vx et vy doivent en fait être (targety - y) * vx/(targetx - X). En d'autres termes, vous ne pouvez pas définir séparément vx et vy et obtenir le résultat souhaité.

+0

Je pense que j'obtiens ceci, donc x + = vx * dt; et y + = (targety - y) * vx/(targetx - x) * dt? –

+0

Oui, mais attention à la division par zéro si (targetx - x) = 0. – Jim

Questions connexes