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 :

Aide canevas boules


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Par défaut Aide canevas boules
    Bonjour, je suis actuellement en train de réaliser un canevas dans lequel il y a deux boules.Le but étant de les faire ricocher contre les paroies et entre elles.

    J'ai déjà réussi à intégrer les deux boules ainsi que de les faire ricocher contre les paroies, mais malheuresement j'ai un problème quand il s'agit de les faire ricocher l'une contre l'autre.

    Je viens demander votre aide. Je vous mets mon début de code ci-dessous afin de comprendre ma démarche.

    Merci d'avance

    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
    #-*-coding:utf-8-*-
    from Tkinter import *
    # définition des gestionnaires
    # d'événements :
    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, -dx, dy
        if y1 >210:
            y1, dx, dy = 210, dx, -dy
        if x1 <10:
            x1, dx, dy = 10, -dx, dy
        if y1 <10:
            y1, dx, dy = 10, dx, -dy
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag >0:
            fen1.after(50,move)       # boucler après 50 millisecondes
     
     
    def move2():
        "déplacement de la balle"
        global x2, y2, dt, dz, flag
        x2, y2= x2 +dt, y2 + dz
        if x2 >210:
            x2, dt, dz = 210, -dt, dz
        if y2 >210:
            y2, dt, dz = 210, dt, -dz
        if x2 <10:
            x2, dt, dz = 10, -dt, dz
        if y2 <10:
            y2, dt, dz = 10, dt, -dz
        can1.coords(oval2,x2,y2,x2+30,y2+30)
        if flag >0:
            fen1.after(50,move2)       # boucler après 50 millisecondes
     
     
     
    def stop_it():
        "arret de l'animation"
        global flag
        flag =0
    def start_it():
        "démarrage de l'animation"
        global flag
        if flag ==0:       # pour ne lancer qu'une seule boucle
            flag =1
            move()
            move2()
    #========== Programme principal =============
    # les variables suivantes seront utilisées de manière globale :
    x1, y1, x2, y2 = 10, 10, 210, 210         # coordonnées initiales
    dx, dy = 15, 3         # 'pas' du déplacement 1
    dt, dz = -15, -3
    flag =0                 # commutateur
    # Création du widget principal ("parent") :
    fen1 = Tk()
    fen1.title("Exercice d'animation avec Tkinter")
    # création des widgets "enfants" :
    can1 = Canvas(fen1,bg='purple',height=250, width=250)
    can1.pack(side=LEFT, padx =5, pady =5)
    oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='white')
    oval2 = can1.create_oval(x2, y2, x2+30, y2+30, width=2, fill='black')
    bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
    bou2.pack()
    bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
    bou3.pack()
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonsoir,
    Tu pourrais te servir de la méthode "Canvas.find_overlapping(a,b,c,d)" qui renvoi l'ensemble des éléments en contact avec le rectangle de coordonnées (a,b,c,d).
    De plus vu que tu travailles avec des cercles, tu pourrais calculer la distance entre les centre de chacun de cercle et si elle est inférieure à (2r+1) alors il y a collision.
    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
    #-*-coding:utf-8-*-
    from Tkinter import *
    # définition des gestionnaires
    # d'événements :
    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, -dx, dy
        if y1 >210:
            y1, dx, dy = 210, dx, -dy
        if x1 <10:
            x1, dx, dy = 10, -dx, dy
        if y1 <10:
            y1, dx, dy = 10, dx, -dy
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag >0:
            fen1.after(50,move)       # boucler après 50 millisecondes
     
     
    def move2():
        "déplacement de la balle"
        global x2, y2, dt, dz, flag
        x2, y2= x2 +dt, y2 + dz
        if x2 >210:
            x2, dt, dz = 210, -dt, dz
        if y2 >210:
            y2, dt, dz = 210, dt, -dz
        if x2 <10:
            x2, dt, dz = 10, -dt, dz
        if y2 <10:
            y2, dt, dz = 10, dt, -dz
        can1.coords(oval2,x2,y2,x2+30,y2+30)
        if flag >0:
            fen1.after(50,move2)       # boucler après 50 millisecondes
     
    ###################### EDIT #########################
    def collision():
        "collisions de balles"
        res = can1.find_overlapping(x2,y2,x2+30,y2+30)
        if len(res)>1:
            print "collision entre les balles."
        if flag >0:
            fen1.after(50,collision)
    ####################### ENDEDIT ####################
     
    def stop_it():
        "arret de l'animation"
        global flag
        flag =0
    def start_it():
        "démarrage de l'animation"
        global flag
        if flag ==0:       # pour ne lancer qu'une seule boucle
            flag =1
            move()
            move2()
            collision()
    #========== Programme principal =============
    # les variables suivantes seront utilisées de manière globale :
    x1, y1, x2, y2 = 10, 10, 210, 210         # coordonnées initiales
    dx, dy = 15, 3         # 'pas' du déplacement 1
    dt, dz = -15, -3
    flag =0                 # commutateur
    # Création du widget principal ("parent") :
    fen1 = Tk()
    fen1.title("Exercice d'animation avec Tkinter")
    # création des widgets "enfants" :
    can1 = Canvas(fen1,bg='purple',height=250, width=250)
    can1.pack(side=LEFT, padx =5, pady =5)
    oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='white')
    oval2 = can1.create_oval(x2, y2, x2+30, y2+30, width=2, fill='black')
    bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
    bou2.pack()
    bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
    bou3.pack()
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()
    @+
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut préparer le terrain de jeu.
    J'ai fait un programme un peu similaire ou il fallait attraper les boules qui apparaissaient a l'écran avec la boule joueur que l'on pouvait déplacer avec les flèches, j'ai utiliser les correspondances entre coordonnées avec des egalitées conditionnelles.

    Sa ne répond pas a ta question question mais je pense qu'il faut commencer par grillager le Canvas de tel façon que tu puisse construire des structures conditionnelles de coordonnées pour les entrechocages si ce n'est déja fait.

    Si tu comprend pas ce que je veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if taille boule == 30 :
      grandeur Canvas 30 * a toi de jouer.

  4. #4
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,
    Citation Envoyé par Luke spywoker
    Sa ne répond pas a ta question question mais je pense qu'il faut commencer par grillager le Canvas de tel façon que tu puisse construire des structures conditionnelles de coordonnées pour les entrechocages si ce n'est déja fait.
    Cette methode me semble adequate uniquement dans les cas des jeux de "grillages" (dames, echecs ...).
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/04/2011, 15h04
  2. [JpGraph] Besoin de conseil/Tuto/aide pour les canevas Jpgraph
    Par titou_777 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 23/03/2009, 13h48
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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