Suivi de trajectoire

Description

Bonsoir,
Ca fait un petit moment que j'ai rien poster... Faut dire que je sais pas vraiment quoi mettre, malgré le fait que j'ai pas mal de projets terminés, et pas mal.

Bref ce programme permet de faire suivre une trajectoire à un objet (ici une PictureBox), en créant des points à n'importe quel endroit de la feuille.

Source / Exemple :


Public Class Form1

    Dim Trajet(0, 1), Max, n As Integer
    Dim Dwn As Boolean

    Sub Projeter(ByVal Element As PictureBox)
        'Cette procédure sert à projeter l'objet en fonction de la trajectoire.
        'Le déplacement est basique ici^^.
        '----------------------------------------NOTE (IMPORTANTE?)-------------------------------
        'Note: Trajet(x,0) représente l'abscisse, et Trajet(x,1) représente l'ordonnée (au cas où_
        'vous ne l'auriez pas deviné^^).
        '-----------------------------------------------------------------------------------------
        With Element
            'Width/2 et Height/2 permettent de placer le centre de l'objet sur le point (ça fait moins moche ;-)^^).
            .Left = Trajet(n, 0) - (.Width / 2)
            .Top = Trajet(n, 1) - (.Height / 2)
        End With
        'On passe à la ligne suivante du tableau.
        n = n + 1
    End Sub

    Private Sub timLoad_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timLoad.Tick
        'Ce Timer permet de générer aléatoirement des points pour constituer la trajectoire.
        Dim a As Integer
        'Tant qu'on peut faire des points,
        For a = 0 To Max
            'On active la fonction Randomize pour plus de suspense^^.
            Randomize()
            'On génère une valeur aléatoire à l'aide de la fonction Rnd() pour les 2 coordonnées.
            Trajet(a, 0) = Int(Rnd() * Me.Width)
            Trajet(a, 1) = Int(Rnd() * Me.Height)
            'On dessine le point correspondant à cette dernière trajectoire.
            Me.CreateGraphics.FillEllipse(Brushes.Black, Trajet(a, 0), Trajet(a, 1), 10, 10)
        Next
        'Une fois les points de la trajectoire générés, on n'a plus besoin de ce Timer.
        timLoad.Enabled = False
        'Du coup, on active celui qui permet de déplacer l'objet en fonction de cette trajectoire.
        timTrj.Enabled = True
    End Sub

    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        'Si l'utilisateur appuie sur la touche "Entrée", on lance le Timer permettant de déplacer l'élément_
        'en fonction de la trajectoire, tout en remettant n à zéro.
        If e.KeyCode = Keys.Return Then
            n = 0
            timTrj.Enabled = True
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'On demande si la trajectoire doit être générée aléatoirement ou si l'utilisateur_
        'préfère tracer lui-même la trajectoire.
        If MsgBox("Voulez-vous générer la trajectoire?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
            timLoad.Enabled = True
        Else
            MsgBox("Cliquez pour créer un point." & vbCrLf & "Appuyez sur ""Entrée"" pour suivre la trajectoire.", MsgBoxStyle.Information)
        End If
        'Note: vous pouvez modifier les 2 valeurs suivantes à votre guise (accès plus simple ici qu'ailleurs^^).
        '-------------------------------------------------------------------------------------------------------
        'On fixe le maximum de points permettant de tracer la trajectoire de l'objet.
        Max = 1000
        'On règle l'intervalle
        timTrj.Interval = 100
        'On redimensionne le tableau mémorisant la trajectoire en fonction de la valeur du maximum.
        'Note: ça ne sert à rien de préserver les valeurs du tableau, puisqu'il n'y en n'a pas^^.
        ReDim Trajet(Max, 1)
        'Ces instructions permettaient de faire un test.
        '-----------------------------------------------
        'Dim a As Integer
        'For a = 0 To 4
        'Trajet(a, 0) = 50
        'Trajet(a, 1) = 250 - (50 * (a + 1))
        'Next
        'For a = 5 To 7
        'Trajet(a, 0) = 50 + (30 * (a - 4))
        'Trajet(a, 1) = 0
        'Next
        'timTrj.Enabled = True
    End Sub

    Private Sub timTrj_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timTrj.Tick
        'Timer permettant de déplacer l'objet selon la trajectoire.
        '----------------------------------------------------------
        'Si les coordonnées sont différentes de (0,0) (->ça signifie qu'aucun point n'est mémorisé dans cette ligne,_
        'bien qu'on puisse définir un point à cet endroit... Mais ça évite de déplacer l'objet alors que ça n'a pas_
        'été demandé.
        If Not (Trajet(n, 0) = 0 And Trajet(n, 1) = 0) Then
            'On vérifie qu'on ne dépasse pas le maximum de points autorisés.
            If n <= Max Then Projeter(picMain) Else GoTo Condition
        Else
            GoTo Condition
        End If
        Exit Sub
Condition:
        'Dans les cas inverses:
        'On désactive le Timer car l'objet n'a plus à être déplacé;
        timTrj.Enabled = False
        Dim a As Integer
        'On vide le tableau afin d'effacer l'ancienne trajectoire;
        For a = 0 To Max
            Trajet(a, 0) = 0
            Trajet(a, 1) = 0
        Next
        'Et on remet n à zéro afin de recommencer la trajectoire depuis le début.
        n = 0
    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        'On note que le click est enclenché.
        Dwn = True
        'On s'assure de ne pas dépasser la limite des points à tracer.
        If n < Max Then
            PointIt(e)
        End If
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        'C'est la même chose que pour l'instruction MouseDown, seulement on trace les points tant que_
        'l'utilisateur déplace la souris, dans la limite des points de trajectoire disponibles.
        If Dwn = True Then
            If n < Max Then
                PointIt(e)
            End If
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        'On indique que le click n'est plus enfoncé pour l'instruction MouseMove.
        Dwn = False
    End Sub

    Sub PointIt(ByVal EventSouris As System.Windows.Forms.MouseEventArgs)
        'On mémorise l'emplacement du point actuel dans le tableau Trajet.
        Trajet(n, 0) = EventSouris.X
        Trajet(n, 1) = EventSouris.Y
        'On créé un point dès que l'utilisateur clique sur la form.
        Me.CreateGraphics.FillEllipse(Brushes.Black, Trajet(n, 0), Trajet(n, 1), 10, 10)
        'On incrémente n pour passer à la prochaine ligne du tableau.
        n = n + 1
    End Sub
End Class

Conclusion :


Les points sont mémorisés dans un tableau aux dimensions étirables, puis affichés un à un et enfin suivis par l'objet.

Il n'y a vraiment rien de compliqué, seulement à la base, je voulais faire chercher le chemin automatiquement par l'objet (ici c'est simplifié, ça se déplace directement sur le point).

Surement que je mettrai à jour en améliorant ça^^ (ça ferait mieux du coup :p).

Voilà, n'hésitez pas à commenter si besoin!

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.