0

我正在绘制一条路径并沿着它移动一个精灵。现在我希望精灵在每个航路点后始终查看行驶方向。使用此代码,我可以设置方向(非平滑)。getTargetAngle 返回新的旋转角度。

float angleDeg = getTargetAngle(sprite.getX(), sprite.getY(), targetX[pWaypointIndex + 1], targetY[pWaypointIndex + 1]);
sprite.setRotation(angleDeg);

现在我可以顺利完成,除了我在 -179° 到 179° 的转折点,它沿着长路径而不是短路径转向并进行跳跃:

sprite.unregisterEntityModifier(rotMod);
rotMod = new RotationModifier(0.5f, currentAngleDeg, angleDeg);
sprite.registerEntityModifier(rotMod);

当两个角度的绝对相加超过 180° 时,我尝试将 360° 添加/隐藏到精灵的当前角度。从 -179° 到 179° 跳跃到从 181 到 179 的跳跃,但这不起作用。

if(Math.abs((float)angleDeg) + Math.abs((float)currentAngleDeg) > 180) {
if (currentAngleDeg < 0) {
    currentAngleDeg+=360.0f;
} else {
    currentAngleDeg-=360.0f;
}

获取目标角度:

public float getTargetAngle(float startX, float startY, float         targetX, float targetY){

    float dX = targetX - startX;
    float dY = targetY - startY;
    float angleRad = (float) Math.atan2(dY, dX);
    float angleDeg = (float) Math.toDegrees(angleRad);
    return angleDeg;
}
4

1 回答 1

1

问题是旋转总是相对于场景的轴方向。由函数 getTargetAngle() 给出的角度需要相对于精灵的当前旋转。

请尝试以下方法,

删除添加/替换 360° 代码,然后将您的 getTargetAngle() 函数替换为以下内容,

public float getTargetAngle(float startX, float startY, float startAngle, float targetX, float targetY){

    float dX = targetX - startX;
    float dY = targetY - startY;

    //find the coordinates of the waypoint in respect to the centre of the sprite
    //with the scene virtually rotated so that the sprite is pointing at 0°

    float cos = (float) Math.cos( Math.toRadians(-startAngle));
    float sin = (float) Math.sin( Math.toRadians(-startAngle));

    float RotateddX = ((dX * cos) - (dY * sin));
    float RotateddY = ((dX * sin) + (dY * cos));

    //Now get the angle between the direction the sprite is pointing and the
    //waypoint
    float angleRad = (float) Math.atan2(RotateddY, RotateddX);

    float angleDeg = (float) Math.toDegrees(angleRad);
    return angleDeg;
}

然后当你到达航点时,

sprite.unregisterEntityModifier(rotMod);
float angleDeg = getTargetAngle(sprite.getX(), sprite.getY(), sprite.getRotation(), targetX[pWaypointIndex + 1], targetY[pWaypointIndex + 1]);
rotMod = new RotationModifier(0.5f, sprite.getRotation(), sprite.getRotation() + angleDeg);
sprite.registerEntityModifier(rotMod);

请注意,旋转修饰符将 getTargetAngle() 的返回值添加到现有的精灵旋转上——它现在是相对于现有角度的角度。

旋转总是发生在角度 <= 180° 的方向上,无论是顺时针还是逆时针。

于 2013-06-21T23:07:43.997 回答