IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Untitled Document

Exemple de dragage

Voici une séquence d'évènements souris invoquée en draguant quelque chose:

1) m1.press vaut VRAI si vous pressez le bouton de la souris (celui-ci vaut 'left' si c'est le bouton gauche; une valeur non nulle vaut VRAI en Python).


2) m1.drag vaut VRAI si les coordonnées de la souris ont changé depuis le temps de m1.press.
Au moment de l'évènement drag, la position de la souris est rapportée pour être ce qu'elle était à l'instant de l'évènement press, si bien que le dragage peut démarrer au lieu où l'utilisateur à d'abord cliqué. Si la souris est en mouvement au moment de l'évènement press, il est tout à fait possible que la prochaine position vue par l'ordinateur, au moment de l'évènement drag, puisse être non loin de la position du clic. Ceci explique pourquoi la position de l'évènement drag est rapportée comme si il survenait à la position press.


3) Aucun évènement ne survient pendant le dragage; vous utilisez continuellement scene.mouse.pos pour mettre à jour ce que vous draguez.


4) m1.drop vaut VRAI si vous relachez le bouton de la souris.

Vous pouvez programmer le dragage de la souris simplement en lisant continuellement la valeur courante de scene.mouse.pos. Voici une routine complète de dragage d'une sphère avec le bouton gauche appuyé. Notez que les instructions rendent le curseur invisible pendant le dragage.

scene.range = 10 # taille fixée, pas de redimensionnement automatique

ball = sphere(pos=(-5,0,0), radius=1., color=color.cyan)

cube = box(pos=(+5,0,0), size=(2,2,2), color=color.red)

pick = None # aucun objet de la scène encore sélectionné

while 1:

    if scene.mouse.events:

        m1 = scene.mouse.getevent() # obtention de l'évènement drag ou drop

        if m1.drag and m1.pick == ball: # si clic sur la balle

            drag_pos = m1.pickpos # où la souris était sur la balle

            pick = m1.pick # pick vaut maintenant VRAI (non nulle)

            scene.cursor.visible = 0 # rend le curseur invisible

        elif m1.drop: # relachement le bouton de la souris à la fin du dragage

            pick = None # fin du dragage (None vaut FAUX)

            scene.cursor.visible = 1 # curseur de nouveau visible

    if pick:

        new_pos = scene.mouse.project(normal=(0,1,0)) # projection sur le plan xz

        if new_pos != drag_pos: # si la souris a bougé depuis la dernière position

            pick.pos += new_pos - drag_pos # offset d'où la balle a été cliquée

            drag_pos = new_pos # mise à jour de la position dragguée

Si vous faites de nombreux traitements de chaque mouvement de souris ou que vous laissez une trainée derrière l'objet en mouvement, vous pouvez avoir besoin de vérifier si la "nouvelle" position de la souris est en faite différente de la position précédente avant de traiter le "mouvement", comme c'est le cas dans l'exemple ci-dessus. Par exemple, une trainée dessinée avec l'objet courbe qui contient un nombre très important de points tous à la même position peut ne pas être affichée correctement.

Seuls quelques objets de VPython peuvent être "sélectionnés" en cliquant dessusn, incluant la sphère, la boîte et le cylindre. Voici une routine plus générale qui vous permet de draguer soit la hampe soit la pointe d'une flèche:

scene.range = 10 # taille fixée, pas de redimensionnement automatique

pointer = arrow(pos=(0,4,0), axis=(3,2,0), color=color.yellow))

tolerance = 0.3 # distance minimale du clic entre la hampe et la pointe

drag = None # n'a pas sélectionnée la hampe ou la pointe de la flèche

while 1:

    if scene.mouse.events:

        m1 = scene.mouse.getevent() # obtention de l'évènement press, drag ou drop

        if m1.press:

            if mag(pointer.pos-m1.pos) <= tolerance:

                drag = 'tail' # pression proche de la hampe de la flèche

            elif mag((pointer.pos+pointer.axis)-m1.pos) <= tolerance:

                drag = 'tip' # pression proche de la pointe de la flèche

            drag_pos = m1.pos # sauvegarde de la position pressée

        elif m1.drag and drag: # si évènement drag et quelque chose à draguer

            scene.cursor.visible = 0 # rend le curseur invisible

        elif m1.drop: # relachement du bouton de la souris à la fin du dragage

            drag = None # fin du dragage (None vaut FAUX)

            scene.cursor.visible = 1 # curseur de nouveau visible

    if drag:

        new_pos = scene.mouse.pos

        if new_pos != drag_pos: # si la souris a bougé depuis la dernière position

            displace = new_pos - drag_pos # de combien la souris a bougé

            drag_pos = new_pos # mise à jour de la position draguée

            if drag == 'tail':

                pointer.pos += displace # déplace la hampe

            else:

                pointer.axis += displace # déplace la pointe

 

Choisissez Précédent, ou Revenez en haut de la documentation sur la souris

 

 

Copyright © 2006 Guillaume et Yoann Duriaud. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.