我正在绘制一条路径并沿着它移动一个精灵。现在我希望精灵总是在每个航路点之后查看行驶方向。 使用此代码,我可以设置方向(非平滑)。 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;
}
getTargetAngle:
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;
}
答案 0 :(得分: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°顺时针或逆时针方向。