2011-05-18 4 views
1

Donc, dans mon jeu Android, je fais avec andengine, je l'ai mis en place de sorte que je touche et fais glisser le sprite du joueur, il tourne continuellement de sorte que le personnage est toujours face à la direction est en train de voyager.Android - problème avec Math.atan2

public class Player extends AnimatedSprite { 
private float lastX = Game.centerX; 
private float lastY = Game.centerY; 
private static int angle = 0; 

// ... 

@Override 
public boolean onAreaTouched(final TouchEvent sceneTouchEvent, final float touchAreaLocalX, final float touchAreaLocalY) { 
    Body body = OrbCatch.physicsWorld.getPhysicsConnectorManager().findBodyByShape(this); 
    if (sceneTouchEvent.getAction() == TouchEvent.ACTION_MOVE) { 
     float currentX = sceneTouchEvent.getX(); 
     float currentY = sceneTouchEvent.getY(); 
     angle = (int) (Math.atan2(currentY - lastY, currentX - lastX) * 180/Math.PI); 
     lastX = currentX; 
     lastY = currentY; 
    } 
    body.setTransform(new Vector2(sceneTouchEvent.getX(),sceneTouchEvent.getY()) 
    .mul(1/PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT),angle); 
    return true; 
} 

} 

La ligne clé est la suivante:

angle = (int) (Math.atan2(currentY - lastY, currentX - lastX) * 180/Math.PI) 

Il prend les dernières coordonnées connues et les coordonnées actuelles, calcule l'angle entre eux, et il convertit de radians en degrés. Eh bien, tout cela fonctionnait bien hier, mais en dépit de ne rien changer de ce code aujourd'hui, il se comporte bizarrement. L'orientation de l'image-objet change de manière erratique, sans motif apparent. Si je le déplace dans un chemin rectiligne, il alterne continuellement entre 2 ou 3 angles nettement différents (généralement l'un d'entre eux est le bon).

modifier: résolu, voir ci-dessous

+1

Y a-t-il une chance que votre corps soit accédé par plusieurs threads simultanément? – sje397

+0

... le résultat de votre jeu de données est de 90 ° sur mon système ...!? –

+0

Je suis avec sje397; je suppose que 'lastX' et' lastY' sont en train de changer. – Gabe

Répondre

1

Le problème était que paramètre d'angle Body.setTransform prend des valeurs en radians, et non degrés. AndEngine est si mal documenté ...

0
math.todegree(math.atan(....)).... 

Vous devez utiliser toDegree().