Android - проблема с Math.atan2 - PullRequest
1 голос
/ 18 мая 2011

Итак, в моей игре на андроид, которую я делаю с anddengine, я настроил ее так, что я касаюсь и перетаскиваю спрайт игрока, он постоянно вращается, так что персонаж всегда направлен в направлении своего движения.

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 отчетливо разными углами (обычно один из них правильный).

edit: решено, см. Ниже

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Проблема заключалась в том, что параметр угла Body.setTransform принимает значения в радианах, а не в градусах. Анденгин так плохо документирован ...

0 голосов
/ 28 июня 2013
math.todegree(math.atan(....))....

Вы должны использовать toDegree().

...