【问题标题】:Android - problem with Math.atan2Android - Math.atan2 的问题
【发布时间】:2013-06-28 21:27:53
【问题描述】:

所以在我使用andengine 制作的android 游戏中,我设置了它,以便当我触摸并拖动玩家精灵时,它会不断旋转,以便角色始终面向其行进的方向。

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 个明显不同的角度之间不断交替(通常其中一个是正确的)。

编辑:已解决,见下文

【问题讨论】:

  • 您的Body 是否有可能被多个线程同时访问?
  • ...您的数据集的结果在我的系统上是 90°...!?
  • 我和 sje397 在一起;我的猜测是 lastXlastY 正在从你下面改变。
  • 不,这是唯一被访问的线程。并且 lastX/lastY 永远不会被触及,甚至在其他任何地方都不会被读取。
  • @Andreas:90 是正确答案。您会注意到 Wolfram 的 tan-1 函数采用 (x, y),而 Java 采用 (y, x),给您带来 90 度的差异。

标签: java android andengine


【解决方案1】:

问题在于 Body.setTransform 角度参数采用弧度值,而不是度数。 Andengine 的文档记录太差了...

【讨论】:

    【解决方案2】:
    math.todegree(math.atan(....))....
    

    你应该使用toDegree()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多