Way to determine the shortest direction to turn. I took it from
this action script sample.
Private Sub Rotate(ByVal fTarget As Single)
' Not already facing that way...
If fTarget <> Character.fAngle Then
' Actual angle.
fFinalAngle = fTarget
' Determine the shortest direction to turn.
Dim fDistanceNormal As Single = Math.Abs(Character.fAngle - fTarget)
Dim fDistanceForward As Single = Math.Abs(Character.fAngle - (fTarget + 360))
Dim fDistanceBackward As Single = Math.Abs(Character.fAngle - (fTarget - 360))
If Math.Min(fDistanceNormal, Math.Min(fDistanceForward, fDistanceBackward)) = fDistanceForward Then
fActualNewAngle = fTarget + 360
ElseIf Math.Min(fDistanceNormal, Math.Min(fDistanceForward, fDistanceBackward)) = fDistanceBackward Then
fActualNewAngle = fTarget - 360
Else
fActualNewAngle = fTarget
End If
' Choose clockwise or anti-clockwise.
If fActualNewAngle > Character.fAngle Then
ChangeMovement(eMovements.RotateClockwise)
Else
ChangeMovement(eMovements.RotateAntiClockwise)
End If
End If
End Sub
Smoothly rotate.
Public Sub Update()
With Character
Select Case .eMovement
Case eMovements.RotateAntiClockwise
If .fAngle > fActualNewAngle Then
.fAngle -= Core.TimeElapsed * 0.5
mActor.SetRotation(0, .fAngle, 0)
Else
.fAngle = fFinalAngle
mActor.SetRotation(0, .fAngle, 0)
ChangeMovement(eMovements.Walk)
End If
Case eMovements.RotateClockwise
If .fAngle < fActualNewAngle Then
.fAngle += Core.TimeElapsed * 0.5
mActor.SetRotation(0, .fAngle, 0)
Else
.fAngle = fFinalAngle
mActor.SetRotation(0, .fAngle, 0)
ChangeMovement(eMovements.Walk)
End If
End Select
End With
End Sub
To use:
Rotate(270)