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 :

Plusieurs conditions à un déplacement.


Sujet :

Tkinter Python

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Par défaut Plusieurs conditions à un déplacement.
    Bonjour, c'est pas la première fois que je poste sur le forum mais :

    Je suis (encore) entrain de réaliser un jeu du type "Flappy Bird" par le biais de Tkinter mais je me confronte à un sacré problème...

    Le problème réside dans la fonction déplacement() (la première), en effet, j'ai réussi à faire en sorte que dès que l'oiseau touche le sol, le déplacement s'arrête grâce à une condition "if".
    J'ai donc voulu mettre en place une deuxième condition grâce à elif pour que le déplacement s'arrête aussi quand l'oiseau touche le plafond sauf que cela ne fonctionne pas.
    Et c'est encore pire, cela "annule" la première condition.

    De plus, après plusieurs tentatives, rien à changer, je ne comprends pas où réside le problème...

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    # On importe Tkinter
    from tkinter import *
    # On importe le module random va nous permettre d’utiliser des fonctions générant des nombres aléatoires.
    import random
    #On importe randint qui va nous perlettre de générer un nombre aléatoire dans un intervalle donné.
    from random import randint
     
     
     
    global h
    global H
     
     
    #height est la hauteur
    #widhth est la largeur
     
    #h est la hauteur du tuyau pointant vers le haut, plus h est grand, plus le tuyau est bas et inversement.
    #h maximum = 128
    #h minimum = 385
    #distance entre les tuyaux vaut 100 pixels
    h = randint(128,385)
    H = randint (128,385)
     
    # On crée une fenêtre, racine de notre interface
    fenetre = Tk()
     
    #La fonction deplacement va permettre, comme son nom l'indique, de déplacer l'objet (ici l'oiseau)
     
    def deplacement():
        #Met en place les coordonnées de l'image
        img_coords=canvas.coords(image_oiseau)
        #Met en place la largeur de l'image
        img_width=O.width()
     
        if img_coords[1] < 416 :  
            #0 représente le déplacmeent de X en abscisse et5 est Y en ordonnée
            canvas.move(image_oiseau,0,5)
            #Il se déplace toutes les 30 millisecondes
            canvas.after (30,deplacement)
     
        elif img_coords[1]>0:
            #0 représente le déplacmeent de X en abscisse et5 est Y en ordonnée
            canvas.move(image_oiseau,0,5)
            #Il se déplace toutes les 30 millisecondes
            canvas.after (30,deplacement)
     
    def sauter(event):
        print('sauter')
        for i in range(20 ): 
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)
           canvas.move(image_oiseau,0, -10)  
           canvas.update(30)
     
    def deplacement1():
        #On commence par associer les coordonnées de l'image à img_coords
        img_coords_sol=canvas.coords(image_sol)
        # On associe ensuite la largeur de l'image à img_width
        img_width_sol=sol.width()
     
    #Le chiffre 144 correspond au X de l'image et permet de le déplacer en entier (je crois)    
        if img_coords_sol[0]+img_width_sol >= 144:
            #canvas.move va permettre de déplacer le sol de -5 pixels en abscisse.
            canvas.move(image_sol,-5,0)
            #canvas.after va permettre de déplacer l'image toutes les 40 milisecondes.
            canvas.after (40,deplacement1)
        else:
            img_coords_sol=canvas.coords(image_sol,144,512)
            canvas.move(image_sol,-5,0)
            canvas.after (40,deplacement1)
     
    def deplacement2():
        img_coords_copy=canvas.coords(image_sol2)
        img_width_copy=sol2.width()
     
    #Si le déplacement est supérieur ou égal à 432 pixels.
        if img_coords_copy[0]+img_width_copy >= 432:
            canvas.move(image_sol2,-5,0)
            canvas.after(40,deplacement2)
    #J'ai mis 434 pour X car 432 est le X de l'image afin qu'on ne le voit plus à l'écran.
        else:
            img_coords_copy=canvas.coords(image_sol2,432,512)
            canvas.move(image_sol2,-5,0)
            canvas.after(40,deplacement2)
     
    def deplacementT():
        h = randint(128,385)
        img_coords_tuyaux=canvas.coords(image_tuyaux)
        img_width_tuyaux=tuyaux.width()
     
    #Plus le chiffre est faible, plus le tuyau se déplace vers le droite.
        if img_coords_tuyaux[0]+img_width_tuyaux >= 288-28:
            canvas.move(image_tuyaux,-5,0)
            canvas.after(40,deplacementT)
        else:
            img_coords_tuyaux=canvas.coords(image_tuyaux,288+28,h)
            canvas.move(image_tuyaux,-5,0)
            canvas.after(40,deplacementT)
     
    def deplacementT2():
        H = randint(128,385)
        img_coords_tuyaux2=canvas.coords(image_tuyaux2)
        img_width_tuyaux2=tuyaux2.width()
     
    #Plus le chiffre est faible, plus le tuyau se déplace vers le droite.
        if img_coords_tuyaux2[0]+img_width_tuyaux2 >= 288-28:
            canvas.move(image_tuyaux2,-5,0)
            canvas.after(40,deplacementT2)
        else:
            img_coords_tuyaux2=canvas.coords(image_tuyaux2,288+28,H)
            canvas.move(image_tuyaux2,-5,0)
            canvas.after(40,deplacementT2)
     
    #On importe les image du jeu
    fond = PhotoImage(file="background-day.png")
    fond2 = PhotoImage(file="background-night.png")
    tuyaux = PhotoImage(file="tuyaux.png")
    tuyaux2 = PhotoImage(file="tuyaux2.png")
    sol = PhotoImage(file="sol-day.png")
    sol2 = PhotoImage(file="sol-day-copy.png")
    oiseau = PhotoImage(file="yellowbird-midflap.png")
    oiseau2 = PhotoImage(file="bluebird-midflap.png")
    oiseau3 = PhotoImage(file="redbird-midflap.png")
     
    #On crée une liste comprenant les deux images des fonds du jeu.
    fond=[fond,fond2]
    #On définit F qui représente le choix aléatoire entre les deux valeurs de la liste "fond" c'est-à-dire une des deux images (nuit ou jour)
    F= random.choice(fond)
     
    #On refait la même chos epour les oiseaux
    oiseau=[oiseau,oiseau2,oiseau3]
    O=random.choice(oiseau)
     
    # interface racine
    #J'ai redéfinit la hauteur pour mettre 510 car le tuyau dépassait (peut-être une erreur à voir avant c'était 512)
    #J'ai redéfinit la hauteur pour mettre 286 car le sol dépassait (peut-être une erreur à voir avant c'était 288)
    canvas = Canvas(fenetre, width=286, height=510)
     
    #On insère les images dans la fenêtre.
    canvas.create_image(144,256, anchor=CENTER,image=F)
    image_tuyaux = canvas.create_image(288+28,h,anchor=CENTER,image=tuyaux)
    image_tuyaux2 = canvas.create_image(432+28+28,H,anchor=CENTER,image=tuyaux2)
    image_sol = canvas.create_image(144,512, anchor=S,image=sol)
    image_sol2 = canvas.create_image(432,512, anchor=S,image=sol2)
    image_oiseau=canvas.create_image(67,244, anchor=S,image=O) 
     
    #On démarre les boucles des déplacements    
    deplacement()
    deplacement1()
    deplacement2()
    deplacementT()
    deplacementT2() 
     
     
    # On affiche le label dans la fenêtre
    canvas.pack()
    canvas.focus_set()
    canvas.bind("<space>",sauter) 
     
    # On démarre la boucle Tkinter qui s'interompt quand on ferme la fenêtre
    fenetre.mainloop()
    Nom : background-day.png
Affichages : 894
Taille : 7,4 KoNom : background-night.png
Affichages : 853
Taille : 3,0 KoNom : bluebird-midflap.png
Affichages : 821
Taille : 3,0 KoNom : redbird-midflap.png
Affichages : 819
Taille : 2,9 KoNom : sol-day.png
Affichages : 1169
Taille : 7,3 KoNom : tuyaux.png
Affichages : 2223
Taille : 8,2 KoNom : tuyaux.png
Affichages : 2223
Taille : 8,2 KoNom : yellowbird-midflap.png
Affichages : 814
Taille : 2,9 KoNom : sol-day.png
Affichages : 1169
Taille : 7,3 Ko

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 14
    Par défaut
    sol_day_copy.png est la même image que sol_day.png d'où le fait que le site dit que c'est les mêmes
    Pareil pour les tuyaux

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Lorsque vous avez ce genre de problème vous commencez par ajouter un print (img_coords[1]) dans votre fonction déplacement pour visualiser comment çà bouge et comprendre pourquoi vos conditions fonctionnent (ou pas).

    Puis si vous ne vous en sortez pas, vous supprimer du code tout ce qui ne sert à rien par rapport au soucis que vous voulez comprendre.

    note: au plus il faut passer du temps à reproduire le problème pour le comprendre (et copier votre tas d'image, c'est du temps) au moins il y aura de gens qui pourront vous aider.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Glouber, plutôt que de mettre X images dans ton sujet, fournis une archive zip (ou autre type, pas de rar pitié) de ton script, c'est assez barbant d'enregistrer les images une à une pour tester, et il y en manque quelques-unes.

    Quelques commentaires.
    - Ce serait bien de nommer tes fonctions de déplacements par ce qu'elles déplacent dans le jeu.
    - Les tuyaux et sols devant se déplacer uniformément, il serait plus simple de créer un groupe d'items en utilisant les tags des items canvas, dès lors une seule fonction de déplacement suffira en appliquant le move sur ce groupe et mettre à jour sols et tuyaux dans des fonctions distinctes, de plus ce sera bien plus simple pour détecter si le piaf s'est mangé un obstacle.
    - Pourquoi donc les images des tuyaux sont si larges ? Cela va être un gros problème pour détecter les collisions avec ton piaf. Il en est de même pour détecter si ton piaf est bien passé entre les tuyaux, comment vas-tu gérer cela sans entrer dans des claculs compliqués ? Puisque les tuyaux haut et bas font partie d'une même images.

Discussions similaires

  1. Mettre plusieurs conditions pour ouverture d'un état
    Par L'Oracle dans le forum Access
    Réponses: 2
    Dernier message: 01/07/2006, 15h33
  2. [XSLT] <xsl:if> test sur plusieurs condition
    Par oxilab dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 30/06/2006, 20h30
  3. [SQL] Requete contenant plusieurs conditions
    Par dj-julio dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/01/2006, 01h24
  4. Plusieur Condition dans REquette UPDATE
    Par ducseb dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/08/2005, 11h46
  5. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 09h04

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