Search Home Members Contacts
About Us
Products
Downloads
Community
Support
Pages: [1]
  Print  
Author Topic: Shortest direction to turn  (Read 739 times)
tagget
Customers
Community Member
*****
Posts: 243


« on: January 24, 2009, 10:35:32 PM »

Way to determine the shortest direction to turn. I took it from this action script sample.

Code:
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.
Code:
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:
Code:
Rotate(270)
Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by SMF 1.1.3 | SMF © 2006-2007, Simple Machines LLC
Seo4Smf v0.2 © Webmaster's Talks