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 d'obstacles avec tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut jeu d'obstacles avec tkinter
    Bonjour à tous, je rédige ce post pour demander votre aide car je suis un peu dos au mur...
    Avec mon groupe d'ISN nous avons pour projet de faire un jeu d'obstacle (un bonhomme doit sauter par dessus des carrés), le problème vient du fait que j'arrive à créer un obstacle qui va de droite à gauche, mais au moment d'en faire plusieurs, qui apparaissent à des moments différents (sinon cela n'aurait pas d'intérêt), c'est l'impasse.

    Je vous joins le code pour générer les obstacles en espérant pouvoir trouver une solution...

    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
     
    obstacle= [0, 0, 0, 0]
    pos_x_o2 = 0
    def app_obst(x):
        global obstacle, del_obst, dpcmt, pos_x_b
        while x >= 0:
                for i in range (len(obstacle)):
                    if i == len(obstacle):
                        i=0
                    can.move(obstacle[i], -dpcmt, 0)
                    x = x - dpcmt
                    print(x, ", ", pos_y_o)
                    if x <= -30:
                        del_obst= True
                        can.delete(obstacle[i])
                    elif (pos_x_b-20 < x < pos_x_b+50) & (pos_y_b+320 < pos_y_o <= pos_y_b+360):
                        game_over()
     
    def deplacement():                                             
            global obstacle, pos_x_o, pos_x_o2, del_obst
            pos_x_o2 = pos_x_o
            while arret == False:
                fen.after(100, app_obst(pos_x_o2))
     
    def obst(): #dessin de l'obstacle
        for i in range (len (obstacle)):
            obstacle[i] = can.create_rectangle(pos_x_o,pos_y_o,pos_x_o+30,pos_y_o+30, fill='red')

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BLOODY_mirai Voir le message
    Bonjour à tous, je rédige ce post pour demander votre aide car je suis un peu dos au mur...
    Avec mon groupe d'ISN nous avons pour projet de faire un jeu d'obstacle (un bonhomme doit sauter par dessus des carrés), le problème vient du fait que j'arrive à créer un obstacle qui va de droite à gauche, mais au moment d'en faire plusieurs, qui apparaissent à des moments différents (sinon cela n'aurait pas d'intérêt), c'est l'impasse.
    Bonjour,

    Faites attention aux tabulations (indentations) dans votre code : Python est très sensible à l'alignement du code dans le bon bloc d'instructions.

    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
    # préférez le pluriel pour les collections d'objets
    # ici obstacles est une collection d'IDs de canvasItems
    obstacles = [0] * 4
     
    # décrivez le rôle de cette variable, svp
    pos_x_o2 = 0
     
    def app_obst(x):
        # on utilise 'global' lorsqu'on MODIFIE une variable globale
        global del_obst
        # on boucle (?)
        while x >= 0:
            # parcourir une collection d'objets
            for obstacle in obstacles:
                # déplacer les obstacles un par un
                can.move(obstacle, -dpcmt, 0)
            # end for
     
            # attention à vos blocs d'indentation /!\
            # NOTE: les balises '# end ...' que j'ai ajoutées
            # vous aident à vous repérer dans le flux du code
     
            # màj index de scrolling
            x -= dpcmt
            # debug: TRON console
            print(x, ", ", pos_y_o)
            # hors limites ?
            if x <= -30:
                # on supprime le premier obstacle du canevas
                can.delete(obstacles[0])
                # màj indicateur
                del_obst = True
            # fin de partie ?
            elif (-20 < x - pos_x_b < 50) and (320 < pos_y_o - pos_y_b <= 360):
                # fini
                game_over()
            # end if
        # end while
    # end def
     
    # NOTE: les balises '# end ...' que j'ai ajoutées
    # vous aident à vous repérer dans le flux du code
     
    def deplacement():
        global pos_x_o2
        pos_x_o2 = pos_x_o
        while not arret:
            fen.after(100, app_obst, pos_x_o2)
        # end while
    # end def
     
    def init_obstacles():
        "dessin des obstacles"
        # taille de l'obstacle
        size = 30
        # écart entre obstacles
        step = size * 2.5
        # boucle sur collection
        for i in range(len(obstacles)):
            # calcul position obstacle
            x = pos_x_o + i * step
            # création de l'obstacle
            obstacles[i] = can.create_rectangle(
                x, pos_y_o,
                x + size, pos_y_o + size,
                fill='red',
            )
        # end for
    # end def
    N'hésitez pas à utiliser des balises # end ... pour faciliter le repérage du flux d'instructions dans le code, cela vous permettra de vous assurer d'être dans le bon alignement (indentation) au bon endroit au bon moment.

    N'essayez pas de résoudre tous les problèmes en une seule fois et en même temps : commencez par résoudre le problème du défilement (scrolling) des obstacles, puis réfléchissez à ce que vous pourriez faire lorsque le premier obstacle affiché sort de la zone d'affichage du canvas et enfin, posez-vous la question "comment détecter simplement le fait qu'il n'y a plus d'obstacles affichés dans le canvas pour déterminer le moment où la partie se termine ?"

    Pour finir, vous utilisez une boucle while x>=0, est-ce vraiment pertinent ?

    Ne vaut-il pas mieux travailler étape par étape ?

    Dans la grande boucle du jeu, il vous faudra une étape où le joueur déplace son coureur, une étape de scrolling des obstacles, une étape de détection de collision entre le coureur et un obstacle et enfin une étape de détection de game over.

    S'il vous faut toutes ces étapes, mieux vaut peut-être dès lors programmer étape par étape.

    @+.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Dans la grande boucle du jeu, il vous faudra une étape où le joueur déplace son coureur, une étape de scrolling des obstacles, une étape de détection de collision entre le coureur et un obstacle et enfin une étape de détection de game over.

    S'il vous faut toutes ces étapes, mieux vaut peut-être dès lors programmer étape par étape.
    bonjour, et bien merci de votre réponse, je vais essyer de faire comme conseillé étape par étape, mais en piochant quand même dans votre code pour essayer de rendre le mien un peu plus fonctionnel... par ailleurs, les problèmes qui se posent assez souvent à moi dans le cas de ce jeu sont aussi le fait de placer les fonctions *args.mainloop()... (qui font tourner la fenêtre graphique en boucle pour ne pas qu'elle se ferme) le plus souvent c'est avec les boucles "while" et "for" que j'ai le problème de la fenêtre qui ne s'ouvre pas mais les coordonnées qui défilent, ou la fenetre qui s'ouvre mais les obstacles qui ne défilent pas (même leurs coordonnées ne sont pas calculées)

    encore merci de votre réponse

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BLOODY_mirai Voir le message
    bonjour, et bien merci de votre réponse, je vais essyer de faire comme conseillé étape par étape, mais en piochant quand même dans votre code pour essayer de rendre le mien un peu plus fonctionnel... par ailleurs, les problèmes qui se posent assez souvent à moi dans le cas de ce jeu sont aussi le fait de placer les fonctions *args.mainloop()... (qui font tourner la fenêtre graphique en boucle pour ne pas qu'elle se ferme) le plus souvent c'est avec les boucles "while" et "for" que j'ai le problème de la fenêtre qui ne s'ouvre pas mais les coordonnées qui défilent, ou la fenetre qui s'ouvre mais les obstacles qui ne défilent pas (même leurs coordonnées ne sont pas calculées)

    encore merci de votre réponse
    Bonjour,

    La méthode widget.mainloop() est la boucle principale du gestionnaire d'événements de Tkinter : il faut donc s'appuyer sur cette boucle pour construire les interactions du jeu (capture touches du clavier, animations découpées dans le temps avec widget.after(delay, func, *args), clics souris, etc) et donc ne vous servir des boucles for / while que pour des petits traitements localisés et non pas pour gérer une boucle programme principale qui viendrait court-circuiter widget.mainloop().

    En termes plus simples, c'est widget.mainloop() la boucle principale de votre jeu, il ne faut donc pas en créer une autre mais plutôt apprendre à vous servir de widget.mainloop() avec pertinence.

    @+.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    merci pour la réponse comme toujours, mais dans la partie de code que vous m'avez envoyé, ou mettre le widget.mainloop() alors pour que la fenêtre graphique se lance? (j'ai essayé de le mettre à la fin mais elle ne voulait pas se lancer...)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    merci pour la réponse comme toujours, mais dans la partie de code que vous m'avez envoyé, ou mettre le widget.mainloop() alors pour que la fenêtre graphique se lance? (j'ai essayé de le mettre à la fin mais elle ne voulait pas se lancer...), j'ai bien sûr préalablement défini le canevas et la fenêtre.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par BLOODY_mirai Voir le message
    merci pour la réponse comme toujours, mais dans la partie de code que vous m'avez envoyé, ou mettre le widget.mainloop() alors pour que la fenêtre graphique se lance? (j'ai essayé de le mettre à la fin mais elle ne voulait pas se lancer...), j'ai bien sûr préalablement défini le canevas et la fenêtre.
    Le plus simple serait de publier la totalité du code du fichier pour que je voie où vous en êtes et comment vous aider.

Discussions similaires

  1. Jeu le mot le plus long avec Tkinter
    Par calaca dans le forum Tkinter
    Réponses: 12
    Dernier message: 10/12/2013, 19h16
  2. [Projet Jeu] - Moteur 2D avec GLScene / Asphyre
    Par Leobaillard dans le forum Langage
    Réponses: 61
    Dernier message: 06/05/2006, 18h26
  3. Comment faire un jeu en réseau avec J2ME ?
    Par Yakurena dans le forum Java ME
    Réponses: 1
    Dernier message: 27/03/2006, 19h09
  4. [Tkinter] Plusieurs fenêtre avec Tkinter
    Par cyrpaut dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/01/2006, 22h24
  5. [Tkinter] Un petit souçis d'event avec Tkinter
    Par fire.stone dans le forum Tkinter
    Réponses: 4
    Dernier message: 29/10/2005, 20h56

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