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):
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):
A noté que les variables "x" et "y" correspondent aux coordonnées du personnage.
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)
Ensuite, je vous montre la condition "si" lors d'un saut, cette condition se fera donc 10 fois car on a initialiser saut à 10:
Et enfin, voici la gestion des collisions:
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
Voilà, j'espère que vous avez compris mon problème et que vous ayez l'aimabilitée de m'aider :/
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
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)
Partager