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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

deplacer une balle sur un canvas en utilisant les flèches


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Par défaut deplacer une balle sur un canvas en utilisant les flèches
    Bonjour à tous,

    voilà, ça fait très peu de temps qu'on a commencé le langage python dans ma classe d'option informatique et je dois avoué que je suis larguée. Je suis sensée rendre un projet vendredi prochain, mais j'ai beaucoup de peine c'est pourquoi je sollicite votre aide.
    Le prof nous a donné le cours de Swinnen et on est sensé choisir l'un des exemples ou exercices pour le programme à réaliser.
    J'ai choisi l'exemple 8.7 que j'ai modifié un peu. Mon but était que la balle avance toute seule (par exemple vers la droite) et qu'au moment où l'on appuit sur les touches de changement de direction elle part dans cette nouvelle direction.
    Avec mon code actuel, la balle fait un carré bizarre et lorsque l'on appuie sur les boutons, elle se déplace de 50 (comme je l'ai paramétré) mais elle continue son chemin habituel. C'est donc pas du tout ce que je voulais.
    Je suis débutante et j'ai beaucoup de mal, donc je me permets de vous demander de l'aide. Est-ce que quelqu'un aurait une solution à m'apporter ? (Si possible simple et en rapport avec le cours)

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    from tkinter import *
    from random import randrange
     
    # procédure générale de déplacement :
    def move():
        "déplacement de la balle"
        global x1, y1, dx, dy, flag
        x1, y1 = x1 +dx, y1 + dy
        if x1 >210:
            x1, dx, dy = 210,0,15
        if y1 >210:
            y1, dx, dy = 210,-15,0
        if x1 <10:
            x1, dx, dy = 10,0,-15
        if y1 <10:
            y1, dx, dy = 10,15,0
     
        can1.coords(oval1, x1,y1, x1+30,y1+30)
        if flag >0:
            fen1.after(100,move)     # boucler, après 50 millisecondes
     
    def start_it():
        "démarrage de l'animation"
        global flag
        if flag ==0:
            flag =1
            move()
     
    def avance(gb, hb):
        global x1, y1
        x1, y1 = x1 +gb, y1 +hb
        can1.coords(oval1, x1,y1, x1+30,y1+30)
     
    # gestionnaires d'évènements:
    def dep1_gauche():
        avance(-50, 0)
     
    def dep1_droite():
        avance(50, 0)
     
    def dep1_haut():
        avance(0, -50)
     
    def dep1_bas():
        avance(0, 50)
     
    # Programme principal
     
    # les variables suivantes seront utilisées de manière globale:
    x1, y1 = 10, 10   #coordonnées initiales
    dx, dy = 15, 0
    flag =0   #commutateur
     
    # Création du widget principal ("maître"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # création des widgets "esclaves":
    can1 = Canvas (fen1, bg='blue', height=300, width=300)
    oval1= can1.create_oval(x1,y1,x1+30,y1+30,width=2,fill='yellow')
    can1.pack(side=LEFT)
    Button(fen1, text='Démarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
     
    # démarrage du réceptionnaire d'évènements (boucle principale):
    fen1.mainloop()

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    En fait il faut que tu identifies les contacts de la balle avec les coins

    • Coin supérieur droit après déplacement horizontal;
    • Coin supérieur gauche après déplacement horizontal;
    • Coin supérieur droit après déplacement vertical;
    • Coin supérieur gauche après déplacement vertical;
    • Coin inférieur droit après déplacement horizontal;
    • Coin inférieur droit après déplacement vertical;
    • etc ...


    Tu peux donc te contenter d'une valeur de déplacement (15 dans ton exemple) et de deux sens de déplacement:
    • sx > déplacement x: -1 = gauche, 0 = aucun, 1 = droite;
    • sy > déplacement y: -1 = haut, 0 = aucun, 1 = bas.


    Il te suffit de jouer avec les valeurs de sx et sy en fonction de l'arrivée de la balle près des bords ou en fonction des évènements boutons.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #!/usr/bin/python
    # -*- coding: utf8 -*-
     
    from Tkinter import *
    from random import randrange
     
    # procédure générale de déplacement :
    def move():
        """déplacement de la balle"""
        global x1, y1, dep, sx, sy, flag
        can1.coords(oval1, x1, y1, x1+30, y1+30)
     
        x1 += (dep * sx)
        if x1 > 260:
            # bord droit
            x1, sx = 260, 0
            if sy == 0:
                # deplacement horizontal
                sy = 1 if y1 < 260 else -1
     
        elif x1 < 10:
            # bord gauche
            x1, sx = 10, 0
            if sy == 0:
                # deplacement horizontal
                sy = -1 if y1 >= 260 else 1
     
        y1 += (dep * sy)
        if y1 > 260:
            # bord inferieur
            y1, sy = 260, 0
            if sx == 0:
                # deplacement vertical
                sx = 1 if x1 < 260 else -1
     
        elif y1 < 10:
            # bord superieur
            y1, sy = 10, 0
            if sx == 0:
                # deplacement vertical
                sx = -1 if x1 >= 260 else 1
     
        if flag > 0:
            fen1.after(20, move)     # boucler, après 20 millisecondes
     
    def start_it():
        "démarrage de l'animation"
        global flag
        flag = not flag
        move()
     
    # gestionnaires d'évènements:
    def dep1_gauche():
        global sx
        sx = -1
     
    def dep1_droite():
        global sx
        sx = 1
     
    def dep1_haut():
        global sy
        sy = -1
     
    def dep1_bas():
        global sy
        sy = 1
     
    # Programme principal
     
    # les variables suivantes seront utilisées de manière globale:
    dep = 5   # valeur de deplacement
    x1, y1 = 10, 10 #coordonnées initiales
    sx, sy = 1, 0
    flag =0   #commutateur
     
    # Création du widget principal ("maître"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # création des widgets "esclaves":
    can1 = Canvas (fen1, bg='blue', height=300, width=300)
    oval1= can1.create_oval(10, 10, 40, 40, width=2, fill='yellow')
    can1.pack(side=LEFT)
    Button(fen1, text='Démarrer', command=start_it).pack(side=BOTTOM)
    Button(fen1, text='Quitter', command=fen1.destroy).pack(side=BOTTOM)
    Button(fen1, text='Gauche',command=dep1_gauche).pack()
    Button(fen1, text='Droite', command=dep1_droite).pack()
    Button(fen1, text='Haut', command=dep1_haut).pack()
    Button(fen1, text='Bas', command=dep1_bas).pack()
     
    # démarrage du réceptionnaire d'évènements (boucle principale):
    fen1.mainloop()
    Si j'ai bien compris, les boutons changent le sens de déplacement de la balle.

    J'ai modifié la valeur de déplacement (5 au lieu de 15) et la valeur du timing (20 au lieu de 100) pour améliorer la fluidité du mouvement.

    Tu remarqueras que le bouton démarrer permet maintenant aussi de mettre en pause.
    Il faudrait que le texte de ce bouton change selon son état -Démarrer/Pause-. Ça, je te le laisse comme exercice.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Par défaut
    Merci beaucoup pour cette aide qui m'est très utile
    Je vais essayer pour le changement d'état du bouton "Démarrer", c'est vrai que ça ferait mieux !

  4. #4
    Membre averti
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Par défaut
    Bonjour je me permet de solliciter votre aide car je réalise un projet du même type.
    J'aimerais réaliser quelque chose de similaire à ce que vous avez fait mais sans limiter le canvas (je réalise une sorte de maze ou la boule ne devrait pas sortir d'un parcours et non d'un canvas et j'ai déjà traité la partie qui concernait les limites du parcours...)
    Du coup si vous pouviez m'expliquer comment faire en sorte d'enlever les limites du canvas ca me serait d'une grande aide
    De plus , je ne comprends pas très bien comment vous faites pour faire en sorte que la boule change definitivement (avec un angle de 90° par rapport a sa trajectoire précédente) de sens...
    Merci de votre aide future!
    Un débutant ...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Bonjour je me permet de solliciter votre aide car je réalise un projet du même type.
    J'aimerais réaliser quelque chose de similaire à ce que vous avez fait mais sans limiter le canvas (je réalise une sorte de maze ou la boule ne devrait pas sortir d'un parcours et non d'un canvas et j'ai déjà traité la partie qui concernait les limites du parcours...)
    Du coup si vous pouviez m'expliquer comment faire en sorte d'enlever les limites du canvas ca me serait d'une grande aide
    De plus , je ne comprends pas très bien comment vous faites pour faire en sorte que la boule change definitivement (avec un angle de 90° par rapport a sa trajectoire précédente) de sens...
    Merci de votre aide future!
    Un débutant ...
    Bonjour,

    Une capture d'écran pour illustrer votre propos serait la bienvenue.
    Merci.
    @+.

  6. #6
    Membre averti
    Homme Profil pro
    Travail
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Travail

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Par défaut
    Je vous envoie le code que j'ai un peu avancé. Je me suis inspiré du code trouvé précédemment sur cette page et d'un tp que nous avions réalisé en début d'année... J'ai notamment changé la fonction "move" mais je ne la comprends pas vraiment et j'aimerais pouvoir l'adapter sans avoir à utiliser de limites du tout et qu'elle réponde aux commandes ce qui n'est pas le cas actuellement.
    Merci de votre aide




    déplacement_internet.py

Discussions similaires

  1. [AC-2010] Reproduire une somme sur un état en utilisant une fonction
    Par marg0t dans le forum IHM
    Réponses: 2
    Dernier message: 12/08/2013, 08h58
  2. Réponses: 2
    Dernier message: 09/08/2010, 18h30
  3. Roulement d'une balle sur un plan incliné
    Par Julien_C++ dans le forum Physique
    Réponses: 1
    Dernier message: 03/06/2007, 19h25
  4. Réponses: 2
    Dernier message: 02/05/2007, 17h08
  5. Rebond d'une balle sur un sol incliné
    Par franco01 dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 05/02/2006, 01h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo