所以在我的Android游戏中,我使用andengine创建了一个触摸并拖动玩家精灵的方法,它不断旋转,以便角色总是面向它的方向正在旅行。Android - 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;
}
}
关键线路是这样的:
angle = (int) (Math.atan2(currentY - lastY, currentX - lastX) * 180/Math.PI)
它需要最后一个已知的坐标和当前坐标,计算它们之间的角度,并从弧度到度转换它。那么,昨天这一切都很正常,但尽管今天没有改变这些代码,但它表现得很奇怪。精灵的方向变化不规律,没有明显的图案。如果我在直线路径上移动它,它会连续在2或3个明显不同的角度之间交替(通常其中一个是正确的)。
编辑:解决,见下文
2011-05-18
herpderp
+1
你的'Body'是否有被多个线程同时访问的机会? –
2011-05-18 06:46:08
+0
...我的系统中数据集的结果是90°...!? –
2011-05-18 06:49:20
+0
我与sje397;我的猜测是'lastX'和'lastY'正在从你的下面改变。 –
2011-05-18 06:51:46