Click here to Skip to main content
15,891,607 members
Articles / Desktop Programming / WPF

Amble Avalona

Rate me:
Please Sign up or sign in to vote.
4.89/5 (51 votes)
2 Feb 2011CPOL4 min read 68K   1.8K   49  
A WPF animaloid
Public Class MainWindow
    Private RhtHindLeg_A_Tr As New RotateTransform
    Private RhtHindLeg_B_Tr As New RotateTransform
    Private RhtHindLeg_C_Tr As New RotateTransform
    Private RhtHindPawTr As New RotateTransform

    Private LeftHindLeg_A_Tr As New RotateTransform
    Private LeftHindLeg_B_Tr As New RotateTransform
    Private LeftHindLeg_C_Tr As New RotateTransform
    Private LeftHindPawTr As New RotateTransform

    Private RhtForeLeg_A_Tr As New RotateTransform
    Private RhtForeLeg_B_Tr As New RotateTransform
    Private RhtForeLeg_C_Tr As New RotateTransform
    Private RhtForePawTr As New RotateTransform

    Private LeftForeLeg_A_Tr As New RotateTransform
    Private LeftForeLeg_B_Tr As New RotateTransform
    Private LeftForeLeg_C_Tr As New RotateTransform
    Private LeftForePawTr As New RotateTransform

    Private TreadmillRedTr As New RotateTransform

    Private FocusOnRightHind As Boolean = True
    Private MoveRhtLegBackwards As Boolean = True
    Private MoveLeftLegBackwards As Boolean = True

    Private speed As Integer = 2
    Private Y_Pos As Double

    Private Sub MainWindow_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles Me.KeyDown
        If e.Key = Key.Right Then
            WalkForward()
        End If
    End Sub

    Private Sub WalkForward()
        If FocusOnRightHind = True Then
            If MoveRhtLegBackwards = True Then
                RightHindBack()
            Else
                RightHindForward()
            End If
        Else
            If MoveLeftLegBackwards = True Then
                LeftHindBack()
            Else
                LeftHindForward()
            End If
        End If

        TreadmillRedTr.Angle -= 5

        RightHindLeg_A.RenderTransform = RhtHindLeg_A_Tr
        RightHindLeg_B.RenderTransform = RhtHindLeg_B_Tr
        RightHindLeg_C.RenderTransform = RhtHindLeg_C_Tr
        RightHindLegPaw.RenderTransform = RhtHindPawTr

        LeftHindLeg_A.RenderTransform = LeftHindLeg_A_Tr
        LeftHindLeg_B.RenderTransform = LeftHindLeg_B_Tr
        LeftHindLeg_C.RenderTransform = LeftHindLeg_C_Tr
        LeftHindLegPaw.RenderTransform = LeftHindPawTr

        RightForeLeg_A.RenderTransform = RhtForeLeg_A_Tr
        RightForeLeg_B.RenderTransform = RhtForeLeg_B_Tr
        RightForeLeg_C.RenderTransform = RhtForeLeg_C_Tr
        RightForeLegPaw.RenderTransform = RhtForePawTr

        LeftForeLeg_A.RenderTransform = LeftForeLeg_A_Tr
        LeftForeLeg_B.RenderTransform = LeftForeLeg_B_Tr
        LeftForeLeg_C.RenderTransform = LeftForeLeg_C_Tr
        LeftForeLegPaw.RenderTransform = LeftForePawTr

        TreadmillRedGroup.RenderTransform = TreadmillRedTr
    End Sub

    Private Sub RightHindBack()
        ' Get to Phase 1. This executes only once.
        If RhtHindLeg_A_Tr.Angle < 4 Then
            RhtHindLeg_A_Tr.Angle += 1 * speed
            RhtHindLeg_B_Tr.Angle += 1 * speed
            RhtHindLeg_C_Tr.Angle -= 1 * speed
            RhtHindPawTr.Angle -= 1 * speed

            LeftHindLeg_A_Tr.Angle -= LeftHindLeg_A_Shift1 * speed
            LeftHindLeg_B_Tr.Angle -= LeftHindLeg_B_Shift1 * speed
            LeftHindLeg_C_Tr.Angle += LeftHindLeg_C_Shift1 * speed
            LeftHindPawTr.Angle += LeftHindLegPawShift1 * speed

            RhtForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift1 * speed
            RhtForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift1 * speed
            RhtForePawTr.Angle -= RhtForeLegPawShift1 * speed

            LeftForeLeg_A_Tr.Angle += LeftForeLeg_A_Shift1 * speed
            LeftForeLeg_B_Tr.Angle -= LeftForeLeg_B_Shift1 * speed
            LeftForeLeg_C_Tr.Angle += LeftForeLeg_C_Shift1 * speed
            LeftForePawTr.Angle -= LeftForeLegPawShift1 * speed
        End If
        ' Get to Phase 2
        If RhtHindLeg_A_Tr.Angle >= 4 And RhtHindLeg_A_Tr.Angle < 8 Then
            RhtHindLeg_A_Tr.Angle += 1 * speed
            RhtHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift2 * speed
            RhtHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift2 * speed
            RhtHindPawTr.Angle += RhtHindLegPawShift2 * speed

            LeftHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift2 * speed
            LeftHindLeg_B_Tr.Angle -= LeftHindLeg_B_Shift2 * speed
            LeftHindLeg_C_Tr.Angle += LeftHindLeg_C_Shift2 * speed
            LeftHindPawTr.Angle += LeftHindLegPawShift2 * speed

            RhtForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift2 * speed
            RhtForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift2 * speed
            RhtForePawTr.Angle -= RhtForeLegPawShift2 * speed

            LeftForeLeg_A_Tr.Angle += LeftForeLeg_A_Shift2 * speed
            LeftForeLeg_B_Tr.Angle -= LeftForeLeg_B_Shift2 * speed
            LeftForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift2 * speed
            LeftForePawTr.Angle += LeftForeLegPawShift2 * speed
        End If
        ' Get to Phase 3
        If RhtHindLeg_A_Tr.Angle >= 8 And RhtHindLeg_A_Tr.Angle < 14 Then
            RhtHindLeg_A_Tr.Angle += 1 * speed
            RhtHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift3 * speed
            RhtHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift3 * speed
            RhtHindPawTr.Angle += RhtHindLegPawShift3 * speed

            LeftHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift3 * speed
            LeftHindLeg_B_Tr.Angle -= LeftHindLeg_B_Shift3 * speed
            LeftHindLeg_C_Tr.Angle += LeftHindLeg_C_Shift3 * speed
            LeftHindPawTr.Angle -= LeftHindLegPawShift3 * speed

            RhtForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift3 * speed
            RhtForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift3 * speed
            RhtForePawTr.Angle -= RhtForeLegPawShift3 * speed

            LeftForeLeg_A_Tr.Angle -= LeftForeLeg_A_Shift3 * speed
            LeftForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift3 * speed
            LeftForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift3 * speed
            LeftForePawTr.Angle += LeftForeLegPawShift3 * speed
        End If

        If RhtHindLeg_A_Tr.Angle = 14 Then
            MoveRhtLegBackwards = False
        End If
    End Sub

    Private Sub RightHindForward()
        ' Get to Phase 4
        If RhtHindLeg_A_Tr.Angle <= 14 And RhtHindLeg_A_Tr.Angle > -4 Then
            RhtHindLeg_A_Tr.Angle -= 1 * speed
            RhtHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift4 * speed
            RhtHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift4 * speed
            RhtHindPawTr.Angle += RhtHindLegPawShift4 * speed

            LeftHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift4 * speed
            LeftHindLeg_B_Tr.Angle += LeftHindLeg_B_Shift4 * speed
            LeftHindLeg_C_Tr.Angle -= LeftHindLeg_C_Shift4 * speed
            LeftHindPawTr.Angle -= LeftHindLegPawShift4 * speed

            RhtForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift4 * speed
            RhtForeLeg_C_Tr.Angle += RhtForeLeg_C_Shift4 * speed
            RhtForePawTr.Angle -= RhtForeLegPawShift4 * speed

            LeftForeLeg_A_Tr.Angle -= LeftForeLeg_A_Shift4 * speed
            LeftForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift4 * speed
            LeftForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift4 * speed
            LeftForePawTr.Angle += LeftForeLegPawShift4 * speed

            ShiftAvalonaUp()
        End If
        If RhtHindLeg_A_Tr.Angle = -4 Then
            LeftForeLeg_C_Tr.Angle = 0
        End If
        ' Get to Phase 5
        If RhtHindLeg_A_Tr.Angle <= -4 And RhtHindLeg_A_Tr.Angle > -14 Then
            ' Multiply by 0.5 since Phase 8 in the original sequence  
            ' was jumped when creating the 5 Phase sequence.
            RhtHindLeg_A_Tr.Angle -= 1 * speed * 0.5
            RhtHindLeg_B_Tr.Angle -= RhtHindLeg_B_Shift5 * speed * 0.5
            RhtHindLeg_C_Tr.Angle += RhtHindLeg_C_Shift5 * speed * 0.5
            RhtHindPawTr.Angle -= RhtHindLegPawShift5 * speed * 0.5

            LeftHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift5 * speed * 0.5
            LeftHindLeg_B_Tr.Angle += LeftHindLeg_B_Shift5 * speed * 0.5
            LeftHindLeg_C_Tr.Angle -= LeftHindLeg_C_Shift5 * speed * 0.5
            LeftHindPawTr.Angle -= LeftHindLegPawShift5 * speed * 0.5

            RhtForeLeg_A_Tr.Angle -= RhtForeLeg_A_Shift5 * speed * 0.5
            RhtForeLeg_B_Tr.Angle -= RhtForeLeg_B_Shift5 * speed * 0.5
            RhtForeLeg_C_Tr.Angle += RhtForeLeg_C_Shift5 * speed * 0.5
            RhtForePawTr.Angle += RhtForeLegPawShift5 * speed * 0.5

            LeftForeLeg_A_Tr.Angle += LeftForeLeg_A_Shift5 * speed * 0.5
            LeftForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift5 * speed * 0.5
            LeftForePawTr.Angle -= LeftForeLegPawShift5 * speed * 0.5

            ShiftAvalonaDown()
        End If

        If RhtHindLeg_A_Tr.Angle = -14 Then
            FocusOnRightHind = False
            ' Set angles to Phase 5 stance
            RhtHndFocusPhase5Stance()
        End If
    End Sub

    Private Sub LeftHindBack()
        ' Get to Phase 2
        If LeftHindLeg_A_Tr.Angle >= 4 And LeftHindLeg_A_Tr.Angle < 8 Then
            LeftHindLeg_A_Tr.Angle += 1 * speed
            LeftHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift2 * speed
            LeftHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift2 * speed
            LeftHindPawTr.Angle += RhtHindLegPawShift2 * speed

            RhtHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift2 * speed
            RhtHindLeg_B_Tr.Angle -= LeftHindLeg_B_Shift2 * speed
            RhtHindLeg_C_Tr.Angle += LeftHindLeg_C_Shift2 * speed
            RhtHindPawTr.Angle += LeftHindLegPawShift2 * speed

            LeftForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift2 * speed
            LeftForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift2 * speed
            LeftForePawTr.Angle -= RhtForeLegPawShift2 * speed

            RhtForeLeg_A_Tr.Angle += LeftForeLeg_A_Shift2 * speed
            RhtForeLeg_B_Tr.Angle -= LeftForeLeg_B_Shift2 * speed
            RhtForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift2 * speed
            RhtForePawTr.Angle += LeftForeLegPawShift2 * speed
        End If
        ' Get to Phase 3
        If LeftHindLeg_A_Tr.Angle >= 8 And LeftHindLeg_A_Tr.Angle < 14 Then
            LeftHindLeg_A_Tr.Angle += 1 * speed
            LeftHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift3 * speed
            LeftHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift3 * speed
            LeftHindPawTr.Angle += RhtHindLegPawShift3 * speed

            RhtHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift3 * speed
            RhtHindLeg_B_Tr.Angle -= LeftHindLeg_B_Shift3 * speed
            RhtHindLeg_C_Tr.Angle += LeftHindLeg_C_Shift3 * speed
            RhtHindPawTr.Angle -= LeftHindLegPawShift3 * speed

            LeftForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift3 * speed
            LeftForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift3 * speed
            LeftForePawTr.Angle -= RhtForeLegPawShift3 * speed

            RhtForeLeg_A_Tr.Angle -= LeftForeLeg_A_Shift3 * speed
            RhtForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift3 * speed
            RhtForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift3 * speed
            RhtForePawTr.Angle += LeftForeLegPawShift3 * speed
        End If

        If LeftHindLeg_A_Tr.Angle = 14 Then
            MoveLeftLegBackwards = False
        End If
    End Sub

    Private Sub LeftHindForward()
        ' Get to Phase 4
        If LeftHindLeg_A_Tr.Angle <= 14 And LeftHindLeg_A_Tr.Angle > -4 Then
            LeftHindLeg_A_Tr.Angle -= 1 * speed
            LeftHindLeg_B_Tr.Angle += RhtHindLeg_B_Shift4 * speed
            LeftHindLeg_C_Tr.Angle -= RhtHindLeg_C_Shift4 * speed
            LeftHindPawTr.Angle += RhtHindLegPawShift4 * speed

            RhtHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift4 * speed
            RhtHindLeg_B_Tr.Angle += LeftHindLeg_B_Shift4 * speed
            RhtHindLeg_C_Tr.Angle -= LeftHindLeg_C_Shift4 * speed
            RhtHindPawTr.Angle -= LeftHindLegPawShift4 * speed

            LeftForeLeg_A_Tr.Angle += RhtForeLeg_A_Shift4 * speed
            LeftForeLeg_B_Tr.Angle += RhtForeLeg_B_Shift4 * speed
            LeftForeLeg_C_Tr.Angle += RhtForeLeg_C_Shift4 * speed
            LeftForePawTr.Angle -= RhtForeLegPawShift4 * speed

            RhtForeLeg_A_Tr.Angle -= LeftForeLeg_A_Shift4 * speed
            RhtForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift4 * speed
            RhtForeLeg_C_Tr.Angle -= LeftForeLeg_C_Shift4 * speed
            RhtForePawTr.Angle += LeftForeLegPawShift4 * speed

            ShiftAvalonaUp()
        End If
        If LeftHindLeg_A_Tr.Angle = -4 Then
            RhtForeLeg_C_Tr.Angle = 0
        End If
        ' Get to Phase 5
        If LeftHindLeg_A_Tr.Angle <= -4 And LeftHindLeg_A_Tr.Angle > -14 Then
            ' Multiply by 0.5 since Phase 8 in the original sequence  
            ' was jumped when creating the 5 Phase sequence.
            LeftHindLeg_A_Tr.Angle -= 1 * speed * 0.5
            LeftHindLeg_B_Tr.Angle -= RhtHindLeg_B_Shift5 * speed * 0.5
            LeftHindLeg_C_Tr.Angle += RhtHindLeg_C_Shift5 * speed * 0.5
            LeftHindPawTr.Angle -= RhtHindLegPawShift5 * speed * 0.5

            RhtHindLeg_A_Tr.Angle += LeftHindLeg_A_Shift5 * speed * 0.5
            RhtHindLeg_B_Tr.Angle += LeftHindLeg_B_Shift5 * speed * 0.5
            RhtHindLeg_C_Tr.Angle -= LeftHindLeg_C_Shift5 * speed * 0.5
            RhtHindPawTr.Angle -= LeftHindLegPawShift5 * speed * 0.5

            LeftForeLeg_A_Tr.Angle -= RhtForeLeg_A_Shift5 * speed * 0.5
            LeftForeLeg_B_Tr.Angle -= RhtForeLeg_B_Shift5 * speed * 0.5
            LeftForeLeg_C_Tr.Angle += RhtForeLeg_C_Shift5 * speed * 0.5
            LeftForePawTr.Angle += RhtForeLegPawShift5 * speed * 0.5

            RhtForeLeg_A_Tr.Angle += LeftForeLeg_A_Shift5 * speed * 0.5
            RhtForeLeg_B_Tr.Angle += LeftForeLeg_B_Shift5 * speed * 0.5
            RhtForePawTr.Angle -= LeftForeLegPawShift5 * speed * 0.5

            ShiftAvalonaDown()
        End If

        If LeftHindLeg_A_Tr.Angle = -14 Then
            FocusOnRightHind = True
            MoveRhtLegBackwards = True
            MoveLeftLegBackwards = True
            LeftHndFocusPhase5Stance()
        End If
    End Sub

    ' Set angles to Phase 5 stance.
    Private Sub RhtHndFocusPhase5Stance()
        RhtHindLeg_A_Tr.Angle = -14
        RhtHindLeg_B_Tr.Angle = -10
        RhtHindLeg_C_Tr.Angle = 4
        RhtHindPawTr.Angle = 20

        LeftHindLeg_A_Tr.Angle = 4
        LeftHindLeg_B_Tr.Angle = 4
        LeftHindLeg_C_Tr.Angle = -4
        LeftHindPawTr.Angle = -4

        RhtForeLeg_A_Tr.Angle = 6
        RhtForeLeg_B_Tr.Angle = -41
        RhtForeLeg_C_Tr.Angle = 68
        RhtForePawTr.Angle = -31

        LeftForeLeg_A_Tr.Angle = 3
        LeftForeLeg_B_Tr.Angle = 2
        LeftForeLeg_C_Tr.Angle = 0
        LeftForePawTr.Angle = -5

        Canvas.SetTop(Avalona, Y_Pos)
    End Sub

    Private Sub LeftHndFocusPhase5Stance()
        LeftHindLeg_A_Tr.Angle = -14
        LeftHindLeg_B_Tr.Angle = -10
        LeftHindLeg_C_Tr.Angle = 4
        LeftHindPawTr.Angle = 20

        RhtHindLeg_A_Tr.Angle = 4
        RhtHindLeg_B_Tr.Angle = 4
        RhtHindLeg_C_Tr.Angle = -4
        RhtHindPawTr.Angle = -4

        LeftForeLeg_A_Tr.Angle = 6
        LeftForeLeg_B_Tr.Angle = -41
        LeftForeLeg_C_Tr.Angle = 68
        LeftForePawTr.Angle = -31

        RhtForeLeg_A_Tr.Angle = 3
        RhtForeLeg_B_Tr.Angle = 2
        RhtForeLeg_C_Tr.Angle = 0
        RhtForePawTr.Angle = -5

        Canvas.SetTop(Avalona, Y_Pos)
    End Sub

    Private Sub ShiftAvalonaUp()
        Dim Avalona_Y As Double = Canvas.GetTop(Avalona)
        ' 4.3 is the distance from Avalona's paw base
        ' and the treadmill surface, when the base of Avalona's
        ' paw has shifted below the treadmill surface
        ' during the shift from Phase 3 to 4.
        Dim Y_Shift As Double = (4.3 / 18) * speed
        Canvas.SetTop(Avalona, (Avalona_Y - Y_Shift))
    End Sub

    Private Sub ShiftAvalonaDown()
        Dim Avalona_Y As Double = Canvas.GetTop(Avalona)
        Dim Y_Shift As Double = (4 / 18) * speed * 0.5
        Canvas.SetTop(Avalona, (Avalona_Y + Y_Shift))
    End Sub

    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
        Y_Pos = Canvas.GetTop(Avalona)
    End Sub
End Class

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Kenya Kenya
Experienced C# software developer with a passion for WPF.

Awards,
  • CodeProject MVP 2013
  • CodeProject MVP 2012
  • CodeProject MVP 2021

Comments and Discussions