Comment faire sauter un cube dans pygame ?
Résolu/Fermé- Gravity pygame
- Cobian backup 11 gravity en français - Télécharger - Sauvegarde
- Installer pygame sur pycharm - Forum Python
- Google gravity j'ai de la chance ✓ - Forum Réseaux sociaux
- Geometry dash pygame ✓ - Forum Python
- Modulenotfounderror: no module named 'pygame' ✓ - Forum Python
9 réponses
22 janv. 2023 à 11:41
Salut,
Il est vrai que si tu débutes, se lancer dans la programmation orientée objet risque fort de te démotiver :( , mais si tu fais une recherche sur le net, tu devrais trouver des exemples qui sont plus à ta portée comme celui-ci :
import pygame pygame.init() win = pygame.display.set_mode((500,500)) pygame.display.set_caption("First Game") x = 100 y = 400 width = 40 height = 60 vel = 10 isJump = False jumpCount = 10 run = True while run: pygame.time.delay(30) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > vel: x -= vel if keys[pygame.K_RIGHT] and x < 500 - vel - width: x += vel if not(isJump): if keys[pygame.K_UP] and y > vel: y -= vel if keys[pygame.K_DOWN] and y < 500 - height - vel: y += vel if keys[pygame.K_SPACE]: isJump = True else: if jumpCount >= -10: y -= (jumpCount * abs(jumpCount)) * 0.5 jumpCount -= 1 else: jumpCount = 10 isJump = False win.fill((0,0,0)) pygame.draw.rect(win, (255,0,0), (x, y, width, height)) pygame.display.update() pygame.quit()
A toi de le comprendre et de le modifier pour ton exo.
22 janv. 2023 à 08:01
bonjour, tu ne peux déplacer ton cube vers le haut? qu'as-tu essayé?
Salut merci de me répondre :)
Bah j'ai d'abord essayer de
- de pouvoir déplacer le cube avec les fleches de haut en bas dans toute la surface - ca ca a marché
- ensuite j'ai voulu le faire sauter quand on touche a espace ou a la fleche du haut mais ca ca marche pas trop (pas du tout xd) j'ai fait une fonction sauter
def sauter(self):
if self.a_sauter:
if self.saut_montee>=10:
self.saut_descente-=1
self.saut=self.saut_descente
else:
self.saut_montee+=1
self.saut=self.saut_montee
if self.saut_descente<0:
self.saut_montee=0
self.saut_descente=5
self.saut.a_sauter = False
self.rect.y=self.rect.y - (10*(self.saut/2))
j'ai mis ca dans la classe Perso, j'ai érit ca dans la boucle de base du jeu
if event.key == pygame.K_UP:
self.perso.a_sauter = True
self.perso.nombre_de_saut+=1
Et puis à la fin j'ai appelé la fonction sauter, mais pareil ca marche pas non plus
Ensuite j'ai suivi un autre tuto mais le jeu ne s'ouvre pas alors qu'il n'y a aucune erreur dans le code :(((
La mon but c'est juste de faire sauter le cube avec space ou la fleche du haut
22 janv. 2023 à 10:12
Pourquoi n'as-tu pas ajouté le code pour sauter à la ligne 58, plutôt que dans la boucle "de base"?
le code avec la fonction def sauter(self): ?
import pygame import self as self from pygame import * # Taille de l'écran (provisoir) LARGEUR_ECRAN = 1600 HAUTEUR_ECRAN = 850 # Classe définissant le personnage #(pour l'instant il y a que son deplacement dans tt l'ecran il faut le resreindre et ajouter tt ses fonctions) class Personnage (pygame.sprite.Sprite): # Iniialisation du perso def __init__(self): super(Personnage, self).__init__() #forme à remplacer par une image self.surf = pygame.Surface ((80, 80)) self.surf.fill ((255, 255, 255)) self.rect = self.surf.get_rect () #coordonnées de base à modifier aussi self.rect.x= 200 self.rect.y= 520 self.saut_montee = 0 self.saut_descente = 3 self.nombre_de_saut = 0 #self.resistance #self.gravity self.pointdevie=3 def sauter(self): if self.a_sauter: if self.saut_montee >= 10: self.saut_descente -= 1 self.saut = self.saut_descente else: self.saut_montee += 1 self.saut = self.saut_montee if self.saut_descente < 0: self.saut_montee = 0 self.saut_descente = 5 self.saut.a_sauter = False self.rect.y = self.rect.y - (10 * (self.saut / 2)) # Mise à jour quand le joueur appuie sur une touche pour le déplacer def update(self, pressed_keys): # Déplacement vers la gauche if pressed_keys[K_LEFT]: self.rect.move_ip(-5, 0) # Déplacement vers la droite if pressed_keys[K_RIGHT]: self.rect.move_ip(5, 0) if pressed_keys[K_UP]: self.a_sauter = True self.nombre_de_saut += 1 if self.rect.left<0: self.rect.left=0 if self.rect.right>LARGEUR_ECRAN: self.rect.right = LARGEUR_ECRAN if self.rect.y<0: self.rect.y=0 if self.rect.y>520: self.rect.y=520 class Obstacle (pygame.sprite.Sprite): """ cette classe est vrm bancale mais elle s'affiche. le but c'est que l'obsatcle ce deplace vers la gauche continuellement jusqu'a la sortie de l'ecran et à terme qu'il y ai plusieurs sous class d'obstacle avec des formes et des effets different (comme dans geometry dash) et que quand coordonnés obstacle=coordonnées personnage (colision) ça enleve un point """ def __init__ (self): super (Obstacle, self).__init__() #forme à remplacer par une image self.surf = pygame.Surface ((60, 60)) self.surf.fill ((255, 0, 55)) self.rect = self.surf.get_rect () self.rect.x = 1500 self.rect.y= 520 # Réglage de l'horloge clock = pygame.time.Clock() # Groupe de Sprites tous_sprites = pygame.sprite.Group() # Création des éléments (c'est pour que les element des classes s'affichent) player = Personnage() obstacles=Obstacle() tous_sprites.add(player) tous_sprites.add(obstacles) # Initialisation de la page pygame.init() pygame.display.set_caption("test jeu") ecran = pygame.display.set_mode([LARGEUR_ECRAN, HAUTEUR_ECRAN]) #fond = pygame.image.load("images/background.png") # Game loop (boucle continue qui met continuellement le jeu à jour) continuer = True while continuer: # fermer la fenetre for event in pygame.event.get(): if event.type == pygame.QUIT: continuer = False # ecran noir (provisoir) #fd ecran.fill((120, 170, 255)) #sol pygame.draw.rect (ecran, (100, 200, 80), (0, 600, 1600, 350)) #touches touche_appuyee = pygame.key.get_pressed() player.update(touche_appuyee) # Recopie des objets sur la surface ecran for mon_sprite in tous_sprites: ecran.blit(mon_sprite.surf, mon_sprite.rect) # On passe notre surface pour l'afficher pygame.display.flip() # Indique à Pygame de ne pas faire plus de 50 fois par seconde la gameloop pour ralentir le déplacement clock.tick(100) pygame.quit()
?
22 janv. 2023 à 10:20
choisis "python" quand tu partages du code python: https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
22 janv. 2023 à 10:23
Où appelles-tu sauter()?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionimport pygame import self as self from pygame import * # Taille de l'écran (provisoir) LARGEUR_ECRAN = 1600 HAUTEUR_ECRAN = 850 # Classe définissant le personnage #(pour l'instant il y a que son deplacement dans tt l'ecran il faut le resreindre et ajouter tt ses fonctions) class Personnage (pygame.sprite.Sprite): # Iniialisation du perso def __init__(self): super(Personnage, self).__init__() #forme à remplacer par une image self.surf = pygame.Surface ((80, 80)) self.surf.fill ((255, 255, 255)) self.rect = self.surf.get_rect () #coordonnées de base à modifier aussi self.rect.x= 200 self.rect.y= 520 self.saut_montee = 0 self.saut_descente = 3 self.nombre_de_saut = 0 #self.resistance #self.gravity self.pointdevie=3 def sauter(self): if self.a_sauter: if self.saut_montee >= 10: self.saut_descente -= 1 self.saut = self.saut_descente else: self.saut_montee += 1 self.saut = self.saut_montee if self.saut_descente < 0: self.saut_montee = 0 self.saut_descente = 5 self.saut.a_sauter = False self.rect.y = self.rect.y - (10 * (self.saut / 2)) # Mise à jour quand le joueur appuie sur une touche pour le déplacer def update(self, pressed_keys): # Déplacement vers la gauche if pressed_keys[K_LEFT]: self.rect.move_ip(-5, 0) # Déplacement vers la droite if pressed_keys[K_RIGHT]: self.rect.move_ip(5, 0) if pressed_keys[K_UP]: self.a_sauter = True self.nombre_de_saut += 1 if self.rect.left<0: self.rect.left=0 if self.rect.right>LARGEUR_ECRAN: self.rect.right = LARGEUR_ECRAN if self.rect.y<0: self.rect.y=0 if self.rect.y>520: self.rect.y=520 class Obstacle (pygame.sprite.Sprite): """ cette classe est vrm bancale mais elle s'affiche. le but c'est que l'obsatcle ce deplace vers la gauche continuellement jusqu'a la sortie de l'ecran et à terme qu'il y ai plusieurs sous class d'obstacle avec des formes et des effets different (comme dans geometry dash) et que quand coordonnés obstacle=coordonnées personnage (colision) ça enleve un point """ def __init__ (self): super (Obstacle, self).__init__() #forme à remplacer par une image self.surf = pygame.Surface ((60, 60)) self.surf.fill ((255, 0, 55)) self.rect = self.surf.get_rect () self.rect.x = 1500 self.rect.y= 520 # Réglage de l'horloge clock = pygame.time.Clock() # Groupe de Sprites tous_sprites = pygame.sprite.Group() # Création des éléments (c'est pour que les element des classes s'affichent) player = Personnage() obstacles=Obstacle() tous_sprites.add(player) tous_sprites.add(obstacles) # Initialisation de la page pygame.init() pygame.display.set_caption("test jeu") ecran = pygame.display.set_mode([LARGEUR_ECRAN, HAUTEUR_ECRAN]) #fond = pygame.image.load("images/background.png") # Game loop (boucle continue qui met continuellement le jeu à jour) continuer = True while continuer: # fermer la fenetre for event in pygame.event.get(): if event.type == pygame.QUIT: continuer = False # ecran noir (provisoir) #fd ecran.fill((120, 170, 255)) #sol pygame.draw.rect (ecran, (100, 200, 80), (0, 600, 1600, 350)) #touches touche_appuyee = pygame.key.get_pressed() player.update(touche_appuyee) # Recopie des objets sur la surface ecran for mon_sprite in tous_sprites: ecran.blit(mon_sprite.surf, mon_sprite.rect) # On passe notre surface pour l'afficher pygame.display.flip() # Indique à Pygame de ne pas faire plus de 50 fois par seconde la gameloop pour ralentir le déplacement clock.tick(100) pygame.quit()
il est dans la classe personnage et j'appelle la classe en bas
jpeux l'appeler saut=sauter() ??
22 janv. 2023 à 10:55
c'est ton premier exercice en python?
Oui :/
22 janv. 2023 à 11:01
Je ne pense pas que tu vas progresser en essayant de modifier un programme que tu ne comprends pas.
Commence par un programme plus simple que tu fais toi-même.
Salut.
Faire sauter un personnage ou un objet, c'est simuler la gravité, donc faire une décélération au fil de la montée, et inversement une accélération lors de la descente, l'un étant l'inverse de l'autre, autant se servir des valeurs de l'ascension pour la chute.
Un exemple evec quelques commentaires.
import pygame as pg FPS = 60 SCREEN_WIDTH = 500 SCREEN_HEIGHT = 400 SCREEN_COLOR = (0, 0, 0) PLAYER_COLOR = (255, 255, 0) PLAYER_SPEED = 8 GRAVITY = 0.18 class Player(pg.sprite.Sprite): def __init__(self): super().__init__() # Un simple surface remplie d'une couleur self.image = pg.Surface((50, 50)) self.image.fill(PLAYER_COLOR) self.rect = self.image.get_rect() self.jumping = False self.jumping_list = [] def jump(self, height): if self.jumping: # Il y a un saut en cours # On ne va pas plus loin return self.jumping_height = height self.jumping_goal = self.rect.y - height self.jumping_list.append(self.rect.y) self.jumping = -1 def left(self): self.rect.x -= PLAYER_SPEED def right(self): self.rect.x += PLAYER_SPEED def update(self): # Phase d'ascension if self.jumping == -1: dy = self.jumping_height * GRAVITY self.jumping_height -= dy self.rect.y -= dy # On ajoute le y à la liste afin de s'en servir lorsque # viendra la chute self.jumping_list.append(self.rect.y) if self.rect.y <= self.jumping_goal: # Ajout de 5 fois la valeur de la hauteur à atteindre # afin d'avoir un effet de "lourdeur" dans la chute self.jumping_list.extend([self.jumping_goal] * 5) # Indique d'on passe à la chute self.jumping = 1 # Phase de descente elif self.jumping == 1: try: # On extrait la dernière valeur de la liste # que l'on affecte à la valeur y du joueur self.rect.y = self.jumping_list.pop() except IndexError: # La liste est vide, et donc on est revenu sur le sol # On cesse la phase de saut et on indique que le joueur peut à # nouveau sauter self.jumping = 0 screen = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) screen_rect = screen.get_rect() player = Player() # On place le player en bas de l'écran et à 30 px du bord gauche player.rect.bottomleft = 30, SCREEN_HEIGHT # On crée un groupe de sprites puis on ajoute notre joueur à ce groupe. draw_group = pg.sprite.Group() draw_group.add(player) clock = pg.time.Clock() running = True while running: for evt in pg.event.get(): if evt.type == pg.QUIT: running = False pressed_keys = pg.key.get_pressed() if pressed_keys[pg.K_LEFT]: player.left() elif pressed_keys[pg.K_RIGHT]: player.right() if pressed_keys[pg.K_UP]: player.jump(100) # Permet que le joueur ne sorte pas des limites de l'écran player.rect.clamp_ip(screen_rect) screen.fill(SCREEN_COLOR) # Mise à jour du groupe, donc de tous les sprites du groupe draw_group.update() # Puis dessin des sprites draw_group.draw(screen) pg.display.update() clock.tick(FPS) pg.quit()
Ajoute des print dans la méthode update du joueur pour bien comprendre si tu as un peu de mal à savoir ce que valent les variables et attributs.
22 janv. 2023 à 15:24
Yess ! Merci ! J'ai réussi à l'adapter à mon code & j'ai compris ttes les lignes !!
Merci beaucoup :D
23 avril 2023 à 18:28
euh bonjour :)))
j'ai une question similaire à celle de ZHN donc j'écris ici pour eviter d'ouvrir un doublon
Je compte aussi prendre la spé NSI et donc j'ai commencé à apprendre quelques trucs. Par contre, dans mon code, je ne comprends pas comment est ce que je pourrais faire pour faire sauter le joueur même quand ile st dans les airs (comme dans flappy bird xd)
23 avril 2023 à 22:12
SI tu ne trouves pas la réponse ici, il est préférable de créer une nouvelle discussion.
24 avril 2023 à 10:12
ok :) merci