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 :

Jeu de labyrinthe - Animation d'une balle.


Sujet :

Tkinter Python

  1. #41
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Okay super merci encore !

    Je crois que je vais attendre encore pour indiquer la discussion comme résolue je crois que je vais encore besoin de vous solliciter ...

    J'ai commencé à me pencher sur la création d'une nouvelle fonction qui permettrait d'animer la balle dans le carré de départ. Est ce que vous pensez à quelque chose de ce genre quand vous me parliez d’animation ou pas du tout?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    def animation_de_depart():
        global dep, sx, sy, r, command, polygone1, polygone2, Polygone3, X, Y 
        if 50<X<110 and 50<X<110:
            X = X + sx*dep
            Y =  Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
    . Vous me parliez d'une possibilité de gérer la fin du jeu avec la même fonction qu'avant ( canvas.find_enclosed()) et je ne suis pas contre du tout ! Au contraire avec les explications que vous m'avez fournies je comprends mieux cette méthode que celle des polygones ou j'ai encore un peu de mal sur certains points! Je vais essayer de chercher par moi même avant de vous poser des questions sur ce problème-ci mais je pense que j'aurais des questions sur ce dernier

    Ps : depuis le début vous faites preuve de beaucoup de pédagogie et me donnez des explications très développées et je voulais vraiment vous en remercier!

  2. #42
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Okay super merci encore !

    Je crois que je vais attendre encore pour indiquer la discussion comme résolue je crois que je vais encore besoin de vous solliciter ...

    J'ai commencé à me pencher sur la création d'une nouvelle fonction qui permettrait d'animer la balle dans le carré de départ. Est ce que vous pensez à quelque chose de ce genre quand vous me parliez d’animation ou pas du tout?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    def animation_de_depart():
        global dep, sx, sy, r, command, polygone1, polygone2, Polygone3, X, Y 
        if 50<X<110 and 50<X<110:
            X = X + sx*dep
            Y =  Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
    Note : utilisez 'global' uniquement pour les variables globales que vous MODIFIEZ.

    Pour accéder à une variable globale en lecture seule, vous n'avez pas besoin de la citer dans 'global'.

    Ici, global X, Y suffit amplement.

    Bon là, vous avez mis le code en vrac, mais y a de ça dans l'idée.

    Votre test if répète deux fois la même chose, quel intérêt ?

    Bien sûr can1.after() devrait lancer plutôt animation_de_depart() que move().

    Il manque l'alternative else: du test if qui devrait aboutir au lancement de move() quand l'animation prend fin.

    Vous devriez utiliser les coordonnées du point médian des deux premiers points de polygone1 comme coordonnées d'arrivée de la balle dans l'animation plutôt que des valeurs numériques en dur.

    Autant que possible, évitez de recourir à des valeurs numériques brutes que vous serez contraints ensuite de modifier alors que vous pouvez extraire des informations beaucoup plus intéressantes dans les données de vos polygone1, polygone2, etc...

    Vous me parliez d'une possibilité de gérer la fin du jeu avec la même fonction qu'avant ( canvas.find_enclosed()) et je ne suis pas contre du tout ! Au contraire avec les explications que vous m'avez fournies je comprends mieux cette méthode que celle des polygones ou j'ai encore un peu de mal sur certains points! Je vais essayer de chercher par moi même avant de vous poser des questions sur ce problème-ci mais je pense que j'aurais des questions sur ce dernier
    Oui, on verra le final après : une chose après l'autre, ne pas essayer de tout résoudre en même temps.

    Ps : depuis le début vous faites preuve de beaucoup de pédagogie et me donnez des explications très développées et je voulais vraiment vous en remercier!
    En même temps, ça occupe mes journées de chômage en me rendant utile, alors tout le monde y trouve son compte.

    @+.

  3. #43
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Votre test if répète deux fois la même chose, quel intérêt ?
    J'avais fait une erreur en fait le Ctrl+v je pense et j'avais inversé les X avec le Y , c'est pour ca que le X apparait 2 fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vous devriez utiliser les coordonnées du point médian des deux premiers points de polygone1 comme coordonnées d'arrivée de la balle dans l'animation plutôt que des valeurs numériques en dur.
    C'est ce que je comptais faire mais on ne les exprime que de manière numérique non? La seule définition du polygone qui est donnée est la suivante si je ne me trompes pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    polygone1 = [100,65,420,65], [100,85,400,85]

  4. #44
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    J'avais fait une erreur en fait le Ctrl+v je pense et j'avais inversé les X avec le Y , c'est pour ca que le X apparait 2 fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vous devriez utiliser les coordonnées du point médian des deux premiers points de polygone1 comme coordonnées d'arrivée de la balle dans l'animation plutôt que des valeurs numériques en dur.
    C'est ce que je comptais faire mais on ne les exprime que de manière numérique non? La seule définition du polygone qui est donnée est la suivante si je ne me trompes pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    polygone1 = [100,65,420,65], [100,85,400,85]
    Quand on parle de coder "en dur", on parle de valeurs constantes placées dans le code de manière peu pertinente.

    Par exemple, votre test if 50 < X < 110 dépend en réalité de l'abscisse du point d'arrivée de la balle, il vaut donc mieux créer un lien direct avec cette abscisse.

    On dit dans ce cas que 50 et 110 sont des valeurs codées en dur parce qu'on pourrait aisément les remplacer par if x0 < X < xA avec x0 et xA des abscisses extraites ou calculées, ce qui est beaucoup plus pertinent, surtout si vous êtes appelés à réajuster vos polygones en cours de développement du logiciel.

    Sinon, bien sûr que les coordonnées du point médian M(x, y) seront numériques, ce n'est pas "numérique" qui pose problème, c'est "en dur".

    En somme, mieux vaut calculer ses coordonnées une fois pour toutes que de passer son temps à devoir se souvenir qu'il faut mettre à jour son code chaque fois qu'on réajuste un polygone.

  5. #45
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    J'ai essayé de respecter vos consignes en re-modifiant le code :
    -j'ai modifié les coordonnées dans la définition du polygone en les remplacants par x1,y1....
    -je n'ai donc nommé qu'une seule fois les coordonnées du carré ce qui est je crois ce que vous me conseillez de faire.
    Voila ce que j'obtiens :

    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
     
    def animation_de_depart():
        global  X, Y #si j'ai bien compris seulement ces deux variables sont nécessaires
        if x1<X<x2 and y1<Y<y2:  #j'utilise les coordonnees du premier carré
            X = X + sx*dep 
            Y = Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep)    #le move n'a ici rien a voir avec la fonction "move" si?
            can1.after(100, animation_de_depart) #modification faite.
        else :
            move()
     
     
          .
          .
          .
     
    #j'ai positionne les x1,x2,y1,y2 avec les autres variables est-ce correct?
    dep = 5  
    X, Y = 80, 68 
    sx, sy = 1, 0
    r = 10
    flag =0
    x1 =50
    y1 =50
    x2 =100
    y2 =100
     
       .
       .
       .
    #je remplace donc les coordonnes numeriques ( et apres test le carre s'affiche normalement)
    can1.create_rectangle(x1,y1,x2,y2)
    Voila ou j'en suis mais le jeu ne respecte pas l'animation du début et je ne comprends pas à quel endroit j'ai oublié/raté quelque chose :/

  6. #46
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    J'ai essayé de respecter vos consignes en re-modifiant le code :
    -j'ai modifié les coordonnées dans la définition du polygone en les remplacants par x1,y1....
    -je n'ai donc nommé qu'une seule fois les coordonnées du carré ce qui est je crois ce que vous me conseillez de faire.
    Voila ce que j'obtiens :

    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
     
    def animation_de_depart():
        global  X, Y #si j'ai bien compris seulement ces deux variables sont nécessaires
        if x1<X<x2 and y1<Y<y2:  #j'utilise les coordonnees du premier carré
            X = X + sx*dep 
            Y = Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep)    #le move n'a ici rien a voir avec la fonction "move" si?
            can1.after(100, animation_de_depart) #modification faite.
        else :
            move()
     
     
          .
          .
          .
     
    #j'ai positionne les x1,x2,y1,y2 avec les autres variables est-ce correct?
    dep = 5  
    X, Y = 80, 68 
    sx, sy = 1, 0
    r = 10
    flag =0
    x1 =50
    y1 =50
    x2 =100
    y2 =100
     
       .
       .
       .
    #je remplace donc les coordonnes numeriques ( et apres test le carre s'affiche normalement)
    can1.create_rectangle(x1,y1,x2,y2)
    Voila ou j'en suis mais le jeu ne respecte pas l'animation du début et je ne comprends pas à quel endroit j'ai oublié/raté quelque chose :/
    Sans le nouveau code publié au complet :

    1. J'aurais du mal à tester chez moi
    2. J'aurais du mal à pister ce qui ne va pas

    Pour ce qui concerne l'animation de départ, il faut suivre cette logique :

    1. La balle est d'abord placée au centre du carré de départ (initialisations)
    2. L'animation commence : la balle doit se déplacer automatiquement (sans que le joueur puisse modifier la trajectoire) du centre du carré jusqu'au minimum l'entrée du premier couloir (polygone1)
    3. Une fois la balle arrivée dans le couloir, la fonction move() prend le relais et le joueur peut enfin influencer la trajectoire de la balle

    J'attends votre code au complet pour pouvoir me prononcer sur ce qui manque ou qui déconne dans l'animation de départ.

    @+.

  7. #47
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Voila le code au complet :

    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from random import randrange
     
    # procédure générale de déplacement :
    def animation_de_depart():
        global  X, Y 
        if x1<X<x2 and y1<Y<y2:
            X = X + sx*dep
            Y = Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep) 
            can1.after(100, animation_de_depart)
        else :
            move()
     
    def move():
        global dep, sx, sy
        # la balle se retrouve-t-elle seule ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) >1:
            game_over()
        # la balle est au moins sur un rail
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
    def bravo():  #cette fonction devrait servir plus tard quand on aura défini le polygone d'arrivée.
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="BIEN JOUE!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def game_over():
        # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
     
    # gestionnaires d'évènements:
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        "démarrage de l'animation"
        global flag
        flag = not flag
        move()
     
    def pause() :
        #nous servira quand on touchera le mur
         "arret de l'animation"
         global flag
         flag =0
     
     
    # Programme principal
     
    # les variables suivantes seront utilisées de manière globale:
    dep = 5   # valeur de deplacement
    X, Y = 80, 68 #coordonnées initiales
    sx, sy = 1, 0
    r = 10
    flag =0   #commutateux
    x1 =50
    y1 =50
    x2 =100
    y2 =100
    # Création du widget principal ("maître"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # création des widgets "esclaves":
    can1 = Canvas (fen1, bg='white', height=500, width=500)
    cerc1 = can1.create_oval(X, Y, X + r, Y + r,fill = 'grey')
    can1.pack(side=LEFT)
    can1.create_rectangle(x1,y1,x2,y2) #dessine un rectangle
    can1.create_rectangle(120,280,170,335)
    polygone1 = [100,65,420,65], [100,85,400,85]
    can1.create_line(tuple(polygone1[0]),fill='red',width=4)#ligne 1
    can1.create_line(tuple(polygone1[1]),fill='red',width=4)#ligne 2
    can1.create_line(400,84,400,300,fill='red',width=4)#ligne 3
    can1.create_line(420,65,420,320,fill='red',width=4)#ligne 4
    can1.create_line(170,320,420,320,fill='red',width=4)#ligne 5
    can1.create_line(170,300,400,300,fill='red',width=4)#ligne 5
     
    # passer la balle au premier plan
     
    can1.tag_raise(cerc1, ALL)
     
    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()
    Button(fen1, text='Accélère!', command=start_it).pack(side=BOTTOM)
    can1.bind("<z>", dep1_haut)
    can1.bind("<s>", dep1_bas)
    can1.bind("<d>", dep1_droite)
    can1.bind("<q>", dep1_gauche)
     
    # démarrage du réceptionnaire d'évènements (boucle principale):
    fen1.mainloop()
    Ps : pour le positionnement automatique de la balle le code est déja prévu pour non? (avec "X, Y = 80, 68 #coordonnées initiales")

  8. #48
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Ps : pour le positionnement automatique de la balle le code est déja prévu pour non? (avec "X, Y = 80, 68 #coordonnées initiales")
    C'est là que vous ne comprenez pas comment vous pouvez exploiter des données existantes.

    Je voudrais que vous déterminiez (X, Y) (coordonnées initiales de la balle) comme étant les coordonnées du point central C(X, Y) du carré de départ à partir des informations qui définissent ce carré de départ.

    Donc, je ne veux pas une initialisation de (X, Y) avec des coordonnées en dur, je veux CALCULER (X, Y) à partir des coordonnées du carré de départ.

    Vous saisissez la différence ?

    Nous verrons ensuite comment assainir la fonction start_it(), qui est le point de départ de votre jeu.

    @+.

  9. #49
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    D'acc!

    On pourrait donc présenter cela de cette manière selon moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X, Y = ((x1+x2)/2), ((y1+y2)/2) #coordonnées initiales
    ps : j'ai un petit souci parfois , lorsque je lance le programme j'obtiens ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      File "C:/Users/Paul/Desktop/Versionfinaletest.py", line 73
    SyntaxError: Non-ASCII character '\xc3' in file C:/Users/Paul/Desktop/Versionfinaletest.py on line 86, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    >>>
    alors qu'à la ligne , tout ce que j'ai c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    # les variables suivantes seront utilisées de manière globale:
    et quand je supprime la ligne , il me remet l'erreur quelques lignes plus loin... sauriez vous d'ou a provient?

    Edit : .souci résolu , causé par la présences de signes comme "é" ou "î" si je ne trompes pas
    . en utilisant le calcul fait précédemment la balle n'apparait pas au centre du carré (je vais chercher ou je me suis raté)

  10. #50
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    D'acc!

    On pourrait donc présenter cela de cette manière selon moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X, Y = ((x1+x2)/2), ((y1+y2)/2) #coordonnées initiales
    Kwa ? des moyennes arithmétiques pour déterminer les coordonnées du point central d'un carré/rectangle ?

    ps : j'ai un petit souci parfois , lorsque je lance le programme j'obtiens ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      File "C:/Users/Paul/Desktop/Versionfinaletest.py", line 73
    SyntaxError: Non-ASCII character '\xc3' in file C:/Users/Paul/Desktop/Versionfinaletest.py on line 86, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    >>>
    alors qu'à la ligne , tout ce que j'ai c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    # les variables suivantes seront utilisées de manière globale:
    et quand je supprime la ligne , il me remet l'erreur quelques lignes plus loin... sauriez vous d'ou a provient?

    Edit : .souci résolu , causé par la présences de signes comme "é" ou "î" si je ne trompes pas
    . en utilisant le calcul fait précédemment la balle n'apparait pas au centre du carré (je vais chercher ou je me suis raté)
    Avez-vous mis les en-têtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    en tout début de fichier Versionfinaletest.py ?

    Si cela ne fonctionne pas, essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/env python
    # -*- coding: cp-1252 -*-

  11. #51
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Kwa ? des moyennes arithmétiques pour déterminer les coordonnées du point central d'un carré/rectangle ?
    C'est ce que je pensais faire... la je ne vois pas vraiment d'autre moyen :/

  12. #52
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    C'est ce que je pensais faire... la je ne vois pas vraiment d'autre moyen :/
    Euh ? Vous êtes en terminale scientifique ?

  13. #53
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Euh oui...
    Bah personnellement pour calculer les coordonnées d'un carré dont je connais les coordonnées je procède de cette manière :
    (il est après très probable que je l'ai mal retranscrit dans le code)

    Nom : Carre2.png
Affichages : 275
Taille : 7,0 Ko

    Je ne comprends pas vraiment ce qui cloche dans cette méthode... Ce que je voulais dire dans je ne vois pas d'autre moyen de calculer cela c'est que pour moi la méthode la plus évidente est celle d'un calcul numérique

    ps : je m'étais loupé sur l'image attachée et je ne réussis pas à l'enlever...
    Images attachées Images attachées  

  14. #54
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Euh oui...
    Bah personnellement pour calculer les coordonnées d'un carré dont je connais les coordonnées je procède de cette manière :
    (il est après très possible que je l'ai mal retranscrit dans le code)

    Nom : Carre.png
Affichages : 279
Taille : 9,8 Ko

    Je ne comprends pas vraiment ce qui cloche dans cette méthode... Ce que je voulais dire dans je ne vois pas d'autre moyen de calculer cela c'est que pour moi la méthode la plus évidente est celle d'un calcul numérique
    Nous sommes bien d'accord, mais il vous manque quelque chose : le rayon de la balle.

    Si vous fournissez (x, y) à create_oval(x, y, x+diametre, y+diametre), votre point central C(x, y) devient le coin supérieur gauche de votre balle (d'où un décalage).

    Pour le calcul par moyennes arithmétiques au temps pour moi, je dis des bêtises : la moitié de la diagonale d'un rectangle de côtés a et b revient bien à calculer la moyenne des coordonnées, c'est bien juste.

  15. #55
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Okay merci
    Du coup je peux laisser un calcul comme celui que j'ai fait sans que ca pose problème non?

    J'ai modifié la position de la balle en tenant compte du rayon ce qui la place effectivement au centre du carré!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X= (((x1+x2))/2) - (r/2)
    Y= (((y1+y2))/2) - (r/2)
    Vous m'aviez parlé d'aborder une refonte de ma fonction start_it , est-ce à cause de cette dernière que mon animation de départ ne marche pas?

  16. #56
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Okay merci
    Du coup je peux laisser un calcul comme celui que j'ai fait sans que ca pose problème non?

    J'ai modifié la position de la balle en tenant compte du rayon ce qui la place effectivement au centre du carré!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X= (((x1+x2))/2) - (r/2)
    Y= (((y1+y2))/2) - (r/2)
    Yeah man!

    Bravo. +1

    Voilà ! Ça au moins, c'est pas codé en dur ! (en général, on essaie d'éviter de coder en dur autant que possible)

    Il suffit maintenant de mettre tout ça au propre, 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
    # Programme principal
     
    # les variables suivantes seront utilisées de manière globale:
     
    dep = 5   # valeur de deplacement
    sx, sy = 1, 0   # sens de déplacement
    flag = 0    # commutateur
     
    # carré de départ
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diamètre balle
    diametre = 10
     
    # coordonnées initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
    SVP, renommez votre variable globale r en d ou en diametre partout dans votre fichier, parce que là, ça porte à confusion (une variable r pour un diamètre, c'est pas clair).

    PS: des fois, il faut vraiment que j'arrête de vieillir, moi, j'ai les neurones qui se ratatinent !


    Vous m'aviez parlé d'aborder une refonte de ma fonction start_it , est-ce à cause de cette dernière que mon animation de départ ne marche pas?
    Oui, regardez ce qui y est codé pour le moment. Où voyez-vous qu'on fait appel à animation_de_depart() dedans ?

    Pour pouvoir utiliser la fonction animation_de_depart(), il faut bien l'appeler à un moment ou à un autre, non ?

  17. #57
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Ouais super! Annimation de départ réussie (le progamme marche bien et j'ai édité la fonction animation_de_départ de manière à enlever le souci de la ligne de l'extrémité du carré de cette manière : (je ne sais pas si c'est très clair ) )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      if x1<X<(x2+1) and y1<Y<y2:
    Bon on approche de la fin c'est encourageant :cool: !!
    Nous avons également un second parcours de réserve et je voulais savoir si il était possible de lancer ce second parcours à la place du premier quand on arrivais dans le carré final ou si il fallait créer un second canvas (ce qui ne serait pas super pratique )...

  18. #58
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Ouais super! Annimation de départ réussie (le progamme marche bien et j'ai édité la fonction animation_de_départ de manière à enlever le souci de la ligne de l'extrémité du carré de cette manière : (je ne sais pas si c'est très clair ) )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      if x1<X<(x2+1) and y1<Y<y2:
    Je répète : j'y vois plus clair quand j'ai le nouveau code mis à jour EN ENTIER, je répète... j'y vois plus clair quand...

    Bon on approche de la fin c'est encourageant :cool: !!
    Nous avons également un second parcours de réserve et je voulais savoir si il était possible de lancer ce second parcours à la place du premier quand on arrivais dans le carré final ou si il fallait créer un second canvas (ce qui ne serait pas super pratique )...
    Oui, vous pouvez lancer le second parcours une fois arrivés et non, il n'y a pas besoin de créer un canvas supplémentaire.

    Pour y arriver, il vous suffit de :

    1. effacer tout le contenu du canevas avec can1.delete(ALL)
    2. appeler une fonction qui dessinera le nouveau parcours
    3. initialiser la nouvelle position de la balle dans le nouveau carré de départ
    4. lancer à nouveau animation_de_depart() + move()

    Je ne vous cache pas que vous serez amenés à un moment ou à un autre à revoir move() et animation_de_depart() pour qu'elles puissent traiter les nouveaux polygones et les nouveaux carrés de départ / d'arrivée, soit en arguments de fonction soit via des variables globales intermédiaires (les arguments de fonction sont tout de même à préférer).

    Vous touchez peut-être à la fin de votre programme, mais votre code -lui- n'a pas fini d'évoluer.

    @+.

  19. #59
    Nouveau membre du Club
    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
    Points : 34
    Points
    34
    Par défaut
    Aha je vous le remet et je promet d'essayer d'y penser la prochaine fois

    Petite question à propos de la création du nouveau parcours : - est-ce-que je dois la faire dans un fichier extérieur du coup pour éviter que les traits s'affichent sur le meme canvas ou dois-je faire comme fait dans le code ci dessous (dans la fonction passer_de_niveau) .

    Je vous re-poste donc le code en entier compte tenu des modifications dues au changement de niveau :

    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
     
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from random import randrange
    from partie1_coord_droite_finie import est_dans_polygone
     
    def animation_de_depart():
        global  X, Y 
        if x1<X<(x2+1) and y1<Y<y2:
            X = X + sx*dep
            Y = Y + sy*dep
            can1.move(cerc1, sx*dep, sy*dep) 
            can1.after(100, animation_de_depart)
        else :
            move()
     
    def move():
        global dep, sx, sy
        # la balle se retrouve-t-elle seule ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) >1:
            game_over()
        # la balle est au moins sur un rail
        else:
            can1.move(cerc1, sx*dep, sy*dep)
            can1.after(100, move)
     
    def bravo():
        global carre1, carre2, carre3, X, Y,diametre
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1])    
         passer_de_niveau()
     
     
    def game_over():
        # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def passer_de_niveau(): 
        if bravo :
            can.delete(ALL)
     
            can1.create_rectangle(x1,y1,x2,y2) #dessine un rectangle
            can1.create_rectangle(120,280,170,335)
            polygone1 = [100,65,420,65], [100,85,400,85]
            can1.create_line(tuple(polygone1[0]),fill='red',width=4)#ligne 1
            can1.create_line(tuple(polygone1[1]),fill='red',width=4)#ligne 2
            can1.create_line(400,84,400,300,fill='red',width=4)#ligne 3
            can1.create_line(420,65,420,320,fill='red',width=4)#ligne 4
            can1.create_line(170,320,420,320,fill='red',width=4)#ligne 5
            can1.create_line(170,300,400,300,fill='red',width=4)#ligne 5
     
            X = (x1 + x2 - diametre) / 2
            Y = (y1 + y2 - diametre) / 2
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        global flag
        flag = not flag
        animation_de_depart()
     
     
    def pause() :
        #nous servira quand on touchera le mur
         "arret de l'animation"
         global flag
         flag =0
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5   # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
    flag = 0    # commutateur
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 10
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
    #coordonnes initiales
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas (fen1, bg='white', height=500, width=500)
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre,fill = 'grey')
    can1.pack(side=LEFT)
    can1.create_rectangle(x1,y1,x2,y2) #dessine un rectangle
    can1.create_rectangle(120,280,170,335)
    polygone1 = [100,65,420,65], [100,85,400,85]
    can1.create_line(tuple(polygone1[0]),fill='red',width=4)#ligne 1
    can1.create_line(tuple(polygone1[1]),fill='red',width=4)#ligne 2
    can1.create_line(400,84,400,300,fill='red',width=4)#ligne 3
    can1.create_line(420,65,420,320,fill='red',width=4)#ligne 4
    can1.create_line(170,320,420,320,fill='red',width=4)#ligne 5
    can1.create_line(170,300,400,300,fill='red',width=4)#ligne 5
     
     
    #Fenetre d'acceuil
    fenac=Tk()
    fenac.title("Accueil")
    fenac.geometry("200x250")
    fenac.resizable(width=False,height=False)
    texte=Label(fenac,text="Bonjour et bienvenue dans -jeu- ! \n \n \n Vous pouvez consulter la rubrique \n Regle du jeu \n avant de vous lancer \n dans une partie.\n \n \n Bon jeu! ;)")
    texte.pack()
    Fermer=Button(fenac,text="Fermer cette fenetre", command = fenac.destroy)
    Fermer.place(x=40,y=200)
     
     
    can1.tag_raise(cerc1, ALL)
     
    Button(fen1, text='Demarrer', 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()
    Button(fen1, text='Accelere!', command=start_it).pack(side=BOTTOM)
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
     
    # demarrage du receptionnaire d'evenements (boucle principale):
    fen1.mainloop()
    Ps : J'ai créé une fonction nommée bravo qui permettrait de détecter la présence de la balle dans le carré d'arrivée qui fonctionnerait en utilisant la méthode des polygones que je proposais il y a un petit bout de temps de manière à voir à la fois la méthode avec " if len(can1.find_overlapping(*can1.bbox(cerc1))) >1:" et celle plus scolaire. (mais la fonction n'est pas encore terminée)

    Ps n'2 j'ai gardé le même parcours en attendant d'avoir créé le second

  20. #60
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FatP0ney Voir le message
    Aha je vous le remet et je promet d'essayer d'y penser la prochaine fois

    Petite question à propos de la création du nouveau parcours : - est-ce-que je dois la faire dans un fichier extérieur du coup pour éviter que les traits s'affichent sur le meme canvas ou dois-je faire comme fait dans le code ci dessous (dans la fonction passer_de_niveau) .

    Je vous re-poste donc le code en entier compte tenu des modifications dues au changement de niveau :

    (snip)(snip)

    Ps : J'ai créé une fonction nommée bravo qui permettrait de détecter la présence de la balle dans le carré d'arrivée qui fonctionnerait en utilisant la méthode des polygones que je proposais il y a un petit bout de temps de manière à voir à la fois la méthode avec " if len(can1.find_overlapping(*can1.bbox(cerc1))) >1:" et celle plus scolaire. (mais la fonction n'est pas encore terminée)

    Ps n'2 j'ai gardé le même parcours en attendant d'avoir créé le second
    Bon, j'ai repris votre code et j'y ai placé à peu près toutes les remarques / annotations / conseils censés répondre à vos questions.

    Normalement, si vous lisez bien tout ce que j'y ai consigné, vous en avez pour un moment à retravailler votre 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
    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
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from random import randrange # vraiment utile, ça ?
     
    from Tkinter import *
     
    import tkMessageBox
     
    from partie1_coord_droite_finie import est_dans_polygone
     
     
    def animation_de_depart():
        global X, Y
        # note : a-t-on réellement besoin de s'assurer que X > x1 et Y > y1 ?
        if X <= x2 and Y <= y2:
            # on peut abréger x = x + a par x += a
            # attention : sx, sy modifiables par le joueur ! (clavier ou clics)
            # il faudrait que animation_de_depart() soit totalement automatique
            # donc insensible aux changements de trajectoire du joueur
            # comment faire cela ?
            X += sx * dep
            Y += sy * dep
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, animation_de_depart)
        else:
            move()
     
    def move():
        # la balle a-t-elle heurté quelque chose ?
        if len(can1.find_overlapping(*can1.bbox(cerc1))) > 1:
            # oui, la partie se termine
            game_over()
        # non, tout va bien, on continue
        else:
            can1.move(cerc1, sx * dep, sy * dep)
            can1.after(100, move)
     
    def bravo():
        # note: ce n'est pas dans bravo() qu'il faut vérifier
        # si la balle est arrivée dans le carré final
        if est_dans_polygone([X,Y],r, carre1[0], carre1[1]):
            passer_de_niveau()
        # ne devrait-on pas plutôt appeler bravo() justement au moment de
        # détecter l'arrivée de la balle dans le carré final ?
        # exemple :
     
        #   if dans_carre_final(XY, r, carre_final[0], carre_final[1]):
        #       bravo()
        #   ...etc...
        #   # fin if
     
        # dans bravo(), vous ne devriez que féliciter le joueur pour sa réussite,
        # attendre qu'il appuie sur une touche quelconque du clavier,
        # puis lancer passer_de_niveau() (ou niveau_suivant() ?)
     
     
    def game_over():
        # la partie est finie !
        left = can1.winfo_reqwidth() // 2
        top = can1.winfo_reqheight() // 2
        can1.create_text(
            left, top - 40,
            text="GAME OVER!",
            font="sans 24 bold",
            fill="gold",
        )
     
    def passer_de_niveau():
        "parcours numéro 2"
        # pourquoi faire 'if bravo:' ???
        if bravo:
            # oui, on efface totalement le canevas
            can1.delete(ALL)
            # oui, on dessine un nouveau parcours
            can1.create_rectangle(x1,y1,x2,y2) #dessine un rectangle
            can1.create_rectangle(120,280,170,335)
            polygone1 = [100,65,420,65], [100,85,400,85]
            can1.create_line(tuple(polygone1[0]),fill='red',width=4)#ligne 1
            can1.create_line(tuple(polygone1[1]),fill='red',width=4)#ligne 2
            can1.create_line(400,84,400,300,fill='red',width=4)#ligne 3
            can1.create_line(420,65,420,320,fill='red',width=4)#ligne 4
            can1.create_line(170,320,420,320,fill='red',width=4)#ligne 5
            can1.create_line(170,300,400,300,fill='red',width=4)#ligne 5
            # coordonnées initiales de la balle
            X = (x1 + x2 - diametre) / 2
            Y = (y1 + y2 - diametre) / 2
     
            # quoi, on redessine pas la balle ???
            # pourquoi ça ?
            # avec can1.delete(ALL) on a TOUT effacé, y compris la balle
     
            # note : tout ça c'est bien joli mais ne pourrait-on pas
            # optimiser le code pour dessiner parcours1 et parcours2
            # grâce à une seule et même fonction init_parcours(carre_depart, parcours, carre_final) ?
     
    def dep1_gauche(event=None):
        global sx, sy
        sx = -1
        sy = 0
     
    def dep1_droite(event=None):
        global sx, sy
        sx = 1
        sy = 0
     
    def dep1_haut(event=None):
        global sy, sx
        sy = -1
        sx = 0
     
    def dep1_bas(event=None):
        global sy, sx
        sy = 1
        sx = 0
     
    def start_it():
        global flag # utile ?
        flag = not flag # utile ?
        animation_de_depart()
     
     
    def pause() :
        "arret de l'animation"
        # la fonction pause() est-elle toujours UTILE ?
        # nous servira quand on touchera le mur
        global flag
        flag = 0
     
     
    # les variables suivantes seront utilisees de maniere globale:
     
    dep = 5         # valeur de deplacement
    sx, sy = 1, 0   # sens de deplacement
    flag = 0        # commutateur           UTILE ?
     
    # carre de depart
    x1, y1 = 50, 50
    x2, y2 = 100, 100
     
    # diametre balle
    diametre = 10
     
    # coordonnees initiales de la balle
    X = (x1 + x2 - diametre) / 2
    Y = (y1 + y2 - diametre) / 2
     
    # Creation du widget principal ("maitre"):
    fen1 = Tk()
    fen1.title("Super Ball")
     
    # creation des widgets "esclaves":
    can1 = Canvas(fen1, bg='white', height=500, width=500)
    can1.pack(side=LEFT)
     
    # dessin parcours no. 1
    can1.create_rectangle(x1, y1, x2, y2) # dessine un rectangle
    can1.create_rectangle(120, 280, 170, 335)
    polygone1 = [100, 65, 420, 65], [100, 85, 400, 85]
    can1.create_line(*polygone1[0], fill='red', width=4) # ligne 1
    can1.create_line(*polygone1[1], fill='red', width=4) # ligne 2
    can1.create_line(400, 84, 400, 300, fill='red', width=4) # ligne 3
    can1.create_line(420, 65, 420, 320, fill='red', width=4) # ligne 4
    can1.create_line(170, 320, 420, 320, fill='red', width=4) # ligne 5
    can1.create_line(170, 300, 400, 300, fill='red', width=4) # ligne 5
     
    # dessin balle
    cerc1 = can1.create_oval(X, Y, X + diametre, Y + diametre, fill='grey')
     
    # balle au premier plan d'affichage
    can1.tag_raise(cerc1, ALL)
     
    # boutons à cliquer
    Button(fen1, text='Demarrer', 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()
    Button(fen1, text='Accelere!', command=start_it).pack(side=BOTTOM)
     
    # touches du clavier
    can1.bind_all("<z>", dep1_haut)
    can1.bind_all("<s>", dep1_bas)
    can1.bind_all("<d>", dep1_droite)
    can1.bind_all("<q>", dep1_gauche)
     
    # flèches du clavier
    can1.bind_all("<Up>", dep1_haut)
    can1.bind_all("<Down>", dep1_bas)
    can1.bind_all("<Left>", dep1_gauche)
    can1.bind_all("<Right>", dep1_droite)
     
    # Fenetre d'accueil --> à revoir entièrement : quid de tkMessageBox.showinfo() ?
     
    # documentation :
     
    # http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/tkMessageBox.html
     
    # exemple :
     
    tkMessageBox.showinfo(
     
        "Accueil",
     
        # note : pour une meilleure lisibilité,
        # vous pouvez découper une chaîne de caractères "abc def ghi"
        # en plusieurs chaînes côte à côte "abc " "def " "ghi"
        # et reporter chaque morceau à la ligne lorsque entre parenthèses
        # exemple :
        #   a = "abc def ghi"
        # et
        #   a = (
        #           "abc "
        #           "def "
        #           "ghi"
        #   )
        # produisent le même résultat ;
     
        "Bonjour et bienvenue dans -jeu- !"
        "\n\n"
        "Vous pouvez consulter la rubrique 'Règles du jeu' "
        "avant de vous lancer dans une partie."
        "\n\n"
        "Bon jeu ! ;)"
    )
     
    # note : avec fenêtre Accueil, vous vous dispersez ;
    # attendez plutôt d'avoir bien mis tout votre code précédent
    # AU PROPRE avant d'envisager de franchir une nouvelle étape
    # dans votre logiciel, en travaillant sur une fenêtre d'accueil et un
    # affichage de règles du jeu ;
     
    """
    fenac = Tk()
    fenac.title("Accueil")
    fenac.geometry("200x250")
    fenac.resizable(width=False, height=False)
    texte = Label(fenac, text="Bonjour et bienvenue dans -jeu- ! \n \n \n Vous pouvez consulter la rubrique \n Regle du jeu \n avant de vous lancer \n dans une partie.\n \n \n Bon jeu! ;)")
    texte.pack()
    Fermer = Button(fenac, text="Fermer cette fenetre", command=fenac.destroy)
    Fermer.pack(pady=20)
    """
     
    # démarrage du gestionnaire d'événements (boucle principale):
    fen1.mainloop()
    @+.

Discussions similaires

  1. Problème avec l'animation d'une balle
    Par Arkey24 dans le forum GUI
    Réponses: 1
    Dernier message: 15/04/2014, 15h21
  2. Réponses: 4
    Dernier message: 11/05/2007, 19h45
  3. Réponses: 6
    Dernier message: 21/03/2005, 13h22
  4. Réponses: 6
    Dernier message: 14/12/2004, 02h47
  5. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03

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