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

Python Discussion :

Problème de saut d'un personnage en pygame [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 8
    Points
    8
    Par défaut Problème de saut d'un personnage en pygame
    Bonjour, j'ai commencer un jeu en pygame: il s'agit d'un personnage qui saute sur des platformes, mais j'ai un soucis lorsqu'on arrive à la gestion des sauts. Mon personnage se déplace correctement sur la droite, la gauche, redescend avec une gravité, tient sur les platformes, etc...

    Voici mon problème: Lorsque j'appuie sur la flèche du haut (K_UP), mon personnage saute correctement et redescend. Mais lorsque je reste appuyer sur la flèche de droite (K_RIGHT) ou de gauche (K_LEFT) PUIS j'appuie sur la flèche du haut, mon personnage saute, mais lorsque le personnage arrête de monter, il redescend VERTICALEMENT malgrés que j'appuie toujours sur la flèche de droite ou de gauche; je suis obligé de relâcher la flèche de droite ou de gauche et rappuyer pour avancer. Ce que je souhaite c'est que mon personnage continue d'avancer à gauche ou droite à ma guise en laissant appuyer sur la touche. Je veux pouvoir modifier la direction de mon personnage (droite-gauche) MÊME dans les airs.

    Voici un petit gif de la fenêtre pygame (je modifierais les graphismes lorsque j'aurais résolu ce problème):
    Nom : pika saut.gif
Affichages : 1891
Taille : 193,7 Ko
    Sur le gif, le problème vient lors de la retombé du personnage. Je voudrais qu'il continue sur la droite lorsque le saut est fini (sachant que j'appuie sur la flèche de droite tout le long du saut)

    Voici maintenant les parties du code en rapport avec le saut:

    Tout d'abord la gestion des événements (toutes informations est écrit en commentaire):
    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
    #gestion des événements
          for event in pygame.event.get():
              if event.type==QUIT:
                  continuer=0
              elif event.type==KEYDOWN:   #appui sur une touche
                  if collision==True:     #si il ya collision (à ignorer)
                      numero=numero+1     # Lors de chaque appui on augmente (il s'agit des 4 images animant la course du pikachu) (à ignorer)
                  if numero==4:     # mais si c'est 4 ... (à ignorer)
                      numero=0      # ... on revient à 0 (à ignorer)
                  tkey=pygame.key.get_pressed()       #on enregistre la touche tapé dans la variable
                  if tkey[K_UP] and saut==0 and collision==True:      #si on appuie sur la flèche du haut ET que on est pas déjà en saut ET que on touche le sol
                      saut=10     #permet d'entrer dans la condition "si" (voir code suivant)
                      collision=False     #on est en l'air, donc on ne touche plus la plateforme
                      numero=2    #3eme image du pikachu, lors du saut l'image restera figé dessus pour plus de réalisme (à ignorer)
                  elif tkey[K_LEFT]:  #si on appuie sur la flèche de gauche
                      x-=10   #on se déplace de 10 pixels vers la gauche
                      direction="gauche"  #le personnage se tourne vers la gauche (à ignorer)
                  elif tkey[K_RIGHT]:     #si on appuie sur la flèche de droite
                      x+=10   #on se déplace de 10 pixels vers la droite
                      direction="droite"      #le personnage se tourne vers la droite (à ignorer)
    A noté que les variables "x" et "y" correspondent aux coordonnées du personnage.

    Ensuite, je vous montre la condition "si" lors d'un saut, cette condition se fera donc 10 fois car on a initialiser saut à 10:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            #gravité
            y+=10   #descente de 10 pixels à chaque passage dans la boucle "while"
     
            #saut
            if saut>=1:
                y-=20               #on monte de 20 pixels
                saut-=1             #la variable saut (initialisé à 10) diminue de 1 à chaque passage dans la condition "si"
                collision==False    #ya plus de collision car on est en l'air
                if tkey[K_LEFT]:    #si on a appuyer sur la flèche de droite avant le saut
                    x-=7            #on va vers la gauche de 7 pixels à chaque passage dans la condition "si"
                if tkey[K_RIGHT]:   #idem mais vers la droite
                    x+=7
    Et enfin, voici la gestion des collisions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            #collision     
            if rect_perso.colliderect(rect_passage_haut) or rect_perso.colliderect(rect_passage_bas):   #si on touche la platforme
                y=y-10      #le personnage monte de 10 pixel (pour annuler la gravité)
                collision=True      #la collision est présente
    Voilà, j'espère que vous avez compris mon problème et que vous ayez l'aimabilitée de m'aider :/
    Pour information, j'ai déjà regarder beaucoup de tutoriels et de problèmes résolu mais: soit ça n'avais rien à voir avec ma situation, soit je n'ai rien compris.
    N'hésitez pas à me donner ne serait qu'une petite piste, ce sera toujours bienvenue !

    EDIT: J'ai oublier de dire que le tout était compris dans une boucle infini while avec une vitesse comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        while continuer:
            clock.tick(30)

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    à quoi correspond la variable saut ? pourquoi vaut-elle 10 (et pas 7, 21 ou 118 par exemple) ?

    au plus simple tu peux tenir à jour une variable directionChoisie qui prendrait les valeurs -1, 1 ou 0 selon que le sprite se dirigeait vers la gauche, la droite ou faisait du sur place avant le saut
    ainsi dans ta clause if saut>=1: t'as juste à rajouter une ligne du genre x += 20 * directionChoisie par exemple.

    c'est simple à mettre en oeuvre avec juste 2/3 lignes de plus, mais le personnage fait toujours des sauts identiques, impossible de corriger la trajectoire en plein vol

    ou plus abouti, tu tiens à jour une variable symbolisant l'accélération horizontale, plus on reste appuyé sur la flèche de droite plus on accélère, jusqu'à atteindre un maximum, si on appuie sur aucune flèche droite/gauche l'accélération diminue d'elle même, si on change de direction elle diminue très vite puis accélère dans l'autre sens

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse si rapide.
    à quoi correspond la variable saut ? pourquoi vaut-elle 10 (et pas 7, 21 ou 118 par exemple) ?
    Saut est initialiser à 0 dans les variables et vaut 10 lorsqu'on saute. Ca aurait pu être 118 mais le saut serait beaucoup trop haut avec nos valeurs, j'ai simplement pris 10 au hasard puis j'ai ajusté le x et y pour que ça donne un saut "correct"


    Sinon, j'ai pris en compte tes conseils et après quelques testes et modifications, je suis arrivé au résultat voulu! Mon personnage peut sauter sans s'arrêter à la fin du saut et peut aussi changer sa trajectoire en plein saut !

    Voici les modifications effectuées:
    Pour les événements, j'ai changé saut=20 au lieu de saut=10 (voir le 2nd bout de code pour comprendre), pour K_LEFT et K_RIGHT, j'ai fait en sorte que on entre dans la condition "si" même en saut MAIS on ne se déplacera pas vers la droite ou gauche, seulement la DIRECTION du personnages changera, ça aura une influence pour après.
    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
     #gestion des événements
            for event in pygame.event.get():
                if event.type==QUIT:
                    continuer=0
                elif event.type==KEYDOWN:   #appui sur une touche
                    if collision==True:     #si il ya collision 
                        numero=numero+1     # Lors de chaque appui on augmente (il s'agit des 4 images animant la course du pikachu) 
                    if numero==4:     # mais si c'est 4 ...
                        numero=0      # ... on revient à 0 
                    tkey=pygame.key.get_pressed()       #on enregistre la touche tapé dans la variable
                    if tkey[K_UP] and saut==0 and collision==True:      #si on appuie sur la flèche du haut ET que on est pas déjà en saut ET que on touche le sol
                        saut=20     #permet d'entrer dans la condition "si" (voir code suivant)
                        collision=False     #on est en l'air, donc on ne touche plus la plateforme
                        numero=2    #3eme image du pikachu, lors du saut l'image restera figé dessus pour plus de réalisme 
                    elif tkey[K_LEFT]:  #si on appuie sur la flèche de gauche
                        if saut==0:   #si on est au sol
                            x-=10   #on se déplace de 10 pixels vers la gauche 
                        direction="gauche"  #le personnage se tourne vers la gauche
                    elif tkey[K_RIGHT]:     #si on appuie sur la flèche de droite
                        if saut==0:     #si on est au sol
                            x+=10   #on se déplace de 10 pixels vers la droite
                        direction="droite"      #le personnage se tourne vers la droite
    Pour la condition "si saut", j'ai fait 2 parties du saut: la montée et la descente. Saut a été mit à 20 au lieu de 10 donc on reste 2 fois plus longtemps dans le "si". Dans la première moitié (pour 20>=saut>=11), on monte comme avant mais dans la deuxième moitié (pour 10>=saut>=1) on redescend à l'aide de la gravité. J'ai aussi changé if tkey[K_RIGHT] par if direction=="droite", de cette façon, on sautera vers là on le personnage regarde et non à l'appuie de la touche du clavier.
    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
            #gravité
            y+=10   #descente de 10 pixels à chaque passage dans la boucle "while"
     
            #saut
            if saut>=1:
                collision==False    #ya plus de collision car on est en l'air
                if saut>=11:           #si le saut est à sa première moitié
                    y-=20              #on monte de 20 pixels
                if saut<=10:        #(inutile mais c'est mieu pour la compréhension du programme)
                    y+=0           #on fait rien, la gravité nous fera redescendre
                if direction=="gauche":    #si on a appuyer sur la flèche de droite avant le saut
                    x-=7            #on va vers la gauche de 7 pixels à chaque passage dans la condition "si"
                if direction=="droite":   #idem mais vers la droite
                    x+=7
                saut-=1             #la variable saut (initialisé à 10) diminue de 1 à chaque passage dans la condition "si"
    Voilà, j'ai rien modifier d'autre. Mais voici un petit gif montrant le saut dans la fenêtre:
    Nom : pika heureux.gif
Affichages : 3490
Taille : 431,5 Ko

    Voilà, j'avoue que le saut n'est pas parfait, mais ça suffit pour l'utilisation que je veut en faire. Je met donc ce sujet en résolu car le problème initial a été résolu !
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Saut d'un personnage sur pygame
    Par eragon014 dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 04/03/2018, 22h06
  2. [Pygame] Problème de sauts avec la 2eme loi de Newton
    Par Marty_and_Doc dans le forum Programmation multimédia/Jeux
    Réponses: 4
    Dernier message: 04/07/2015, 22h04
  3. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Programmation multimédia/Jeux
    Réponses: 7
    Dernier message: 08/05/2013, 02h04
  4. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Général Python
    Réponses: 15
    Dernier message: 24/04/2013, 00h42
  5. Saut d'un personnage
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 08/02/2005, 10h19

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