2010-10-17 9 views
0

J'essaye d'écrire la logique d'une séquence d'animation et je n'arrive pas à la corriger. Ce que je veux arriver est: si l'utilisateur clique sur l'écran, la méthode prend dans les coordonnées touchEvent, puis modifie les variables de mouvement d'une image-objet de sorte que le sprite se déplace à l'endroit où l'utilisateur a touché l'écran. J'ai ma configuration d'événement de "lancement" comme ceci.Android Animation Question

public void launch(float eventX, float eventY) { 
    //get the touch event coords and then move the banana to them. 
    fire = true; 
       //the x and y variables for the sprite 
    getX(); 
    getY(); 
       //the target x and y variables 
    targetX = eventX; 
    targetY = eventY; 
       //the total distance the two variable have to "travel" 
    distanceX = x - targetX; 
    distanceY = y - targetY; 
       //variables to update the movement 
    moveX = distanceX; 
    moveY = distanceY; 
} 

Alors, je pensais que je devais mettre les variables de mouvement dans la méthode de mise à jour comme celui-ci:

public void update(long gameTime) { 
    if(gameTime > frameTicker + framePeriod) { 
     frameTicker = gameTime; 
     currentFrame++; 
     if(currentFrame >= frameNbr){ 
      currentFrame = 0; 

     } 
    } 
    this.sourceRect.left = currentFrame * spriteWidth; 
    this.sourceRect.right = this.sourceRect.left + spriteWidth; 
    if(fire == true){ 
     x = (int) moveX; 
     y = (int) moveY; 
    } 

Si l'utilisateur clique comme il est, l'animation apparaît comme il est censé, mais alors instantanément va dans le coin supérieur gauche de l'écran ou ce que je viens de comprendre est (0,0) sur un système de coordonnées. Je n'arrive pas à comprendre comment le ralentir afin qu'il se déplace dans un espace raisonnable et qu'il se dirige là où il est supposé le faire.

Répondre

1

Vous pouvez mettre toute l'animation dans votre fonction launch() si vous le souhaitez.

Par exemple, à la fin de la fonction quelque chose comme:

float incrementX = distanceX/100; 
float incrementY = distanceY/100; 
float spriteX = getX(); 
float spriteY = getY(); 
bool xDone = false; 
bool yDone = false; 

while(!(xDone && yDone)) { 
    if (distanceX <= spriteX) { 
    spriteX += incrementX; // update the sprite's x coordinate as well 
    } 
    if (distanceY <= spriteY) { 
    spriteY += incrementY; // update the sprite's y coordinate as well 
    } 
    try{ Thread.sleep(10) } catch(Exception e) {} 
} 

ce code repose sur l'image-objet à partir d'un bas x et y que l'événement; Si ce n'est pas le cas, il doit être modifié.