Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gerer les collisions avec pygame

Collisions

Sujet résolu
    13 août 2013 à 15:08:33

    Bonjour à tous,

    après de multiples recherches sur internet et sur la documentation de pygame durant 1 mois, je n'arrive toujours pas à percer le mystère des collisions.

    j'ai lu une tonne de tutoriels sur les sprites etc... et je n'est jamais rien compris.

    je sais que le sujet à déjà été posté, mais là je suis vraiment bloqué.

    svp aidez moi, comment gerer les collisions ?

    est-ce possible sans utiliser des sprites car j'ai crus comprendre que les sprites c'était pour les collisions entres choses  qui se déplacent comme une balle rebondissante.

    alors que moi je veux juste que mon petit personnage s’arrête devant un mur sur l'image, et qu'il ne passe pas par dessus si vous voyez ce que je veux dire.

    Merci pour vos réponses.

    Everyatis

    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2013 à 19:23:12

      Les collisions sont très faciles à gérer avec Pygame quand tu te sers de peu d'éléments sur ton affichage.

      Par exemple ton personnage est défini par un carré (posx, posy, xlen, ylen) et si ce n'est pas le cas tu devrai le faire.

      On va dire que ton "mur" est placé ailleurs sur la carte et consiste aussi en un carré. Tes collisions se dérouleront comme suit :

      monpersonnage = pygame.Rect(1, 1, 32, 32)
      monmur = pygame.Rect(50, 50, 32, 32)
      mondeuxiememur = pygame.Rect(100, 100, 32, 32)
      
      # On créé un liste contenant tous les carrés collisionants :
      mescollisions = [monmur, mondeuxiememur]
      
      if monpersonnage.collidelist(mescollisions) == -1:
          #Le personnage ne peut pas bouger ! Il est en collision !
      else:
          # Le personnage peut bouger, il n'est pas en collision
      


      Si tu veux un exemple concret :

      pygame.init()
      screen = pygame.display.set_mode((640, 640))
      screen_buf = pygame.Surface(screen.get_size())
      clock = pygame.time.Clock()
      angus = Hero()
      
      formosa = TiledRenderer(filename)
      run = True
      while run:
          key=pygame.key.get_pressed()
              try:
                  event = pygame.event.wait()
                  if event.type == KEYDOWN:
                      if (event.key == K_LEFT):
                          if angus.direction != DIRECTIONS['left']:
                              angus.direction = DIRECTIONS['left']
                              angus.update_now()
                          else:
                              angus.update()
                          testrect = pygame.Rect(angus.collision.x-2, angus.collision.y, 26, 16 )
                          if testrect.collidelist(formosa.boxcollider) == -1:
                              angus.position.x -= 2
                              angus.collision.x -= 2
      # .. Le même type de condition pour les 3 autres mouvements
                      elif (event.key == K_ESCAPE):
                          menu = Menu(screen, team)
                          menu.open_menu()
      
                  if event.type == QUIT: run = False

      except KeyboardInterrupt: run = False formosa.terrain_render(screen_buf) formosa.over_terrain_render(screen_buf) formosa.under_char_render(screen_buf) screen_buf.blit(angus.image,angus.position) formosa.over_char_render(screen_buf) pygame.transform.scale(screen_buf, screen.get_size(), screen) pygame.display.flip() clock.tick(60)

      Boxcolider contient tous les carrés de colisions qui sont générés lors du render du terrain.

      -
      Edité par Depado 13 août 2013 à 19:34:52

      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2013 à 20:19:12

        <body>j'en profite pour poser une petite question : peut faire d'autre type de hitbox que des hitbox carrés ?
        • Partager sur Facebook
        • Partager sur Twitter
        Si c'était facile, tout le monde le ferait.
          13 août 2013 à 20:24:15

          Bien sûr avec les masques alpha.

          Je te laisse chercher plus en détail car je n'en ai jamais fait mais je vais m'y mettre dans peu de temps.
          http://www.pygame.org/docs/ref/mask.html

          • Partager sur Facebook
          • Partager sur Twitter
            13 août 2013 à 21:05:53

            <body>ok je vais voir ca merci :)
            • Partager sur Facebook
            • Partager sur Twitter
            Si c'était facile, tout le monde le ferait.
              13 août 2013 à 21:28:11

              J'ai déjà étudié la question en fait, il s'agit de dire : "La boite de collision inclu/exclu/n'est que la partie alpha de l'image" à savoir la transparence. Par contre ça peut poser des problèmes de performances quand une centaine d'objets sont sur l'affichage et que toutes les collisions sont testées à chaque tour de boucle.
              • Partager sur Facebook
              • Partager sur Twitter
                13 août 2013 à 23:55:33

                <body><p>mais ya pas moye mn de faire des hitbox rondes ou autres formes ? <p>juste par curiosité...
                • Partager sur Facebook
                • Partager sur Twitter
                Si c'était facile, tout le monde le ferait.
                  14 août 2013 à 10:15:06

                  Merci beaucoup Fire4764

                  je vais essayer avec ta méthode, et je posterai mon code si je ny arrive pas.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 août 2013 à 10:27:46

                    Pas de quoi ^^ J'ai aussi eu du mal au début avec le manque d'explications claire sur Pygame.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 août 2013 à 10:35:04

                      Fire4764, je n'arrive pas à attribuer ce que tu ma appris sur mon  code.

                      car si j'essay de le faire, mon personnage n'a plus aucun moyens pour se déplacer.

                      et surtout comment je fais pour sélectionner monmur sur l'image (oui j'ai déjà dessiné le mur sur l'image de fond)

                      voici mon code, si tu pouvait refaire tes exemples dessus pour que je comprennes mieux se serait très sympas !

                      import pygame
                      from pygame.locals import *
                      from constantes import *
                      from tkinter import *
                       
                      # On crée une fenêtre, racine de notre interface
                      fenetre = Tk()
                      fenetre.title('Launcher ')
                      fenetre.geometry('500x500')
                      champ_label = Label(fenetre, text="Bienvenue")
                      bouton_quitter = Button(fenetre, text="Lancer le jeu", command=fenetre.quit)
                      bouton_quitter.pack()
                      champ_label.pack()
                      fenetre.mainloop()
                        
                      pygame.init()
                        
                      #Ouverture de la fenêtre Pygame
                      fenetre = pygame.display.set_mode((640, 480))
                       
                      #Personnalisation du jeu
                      icone = pygame.image.load(image_icone)
                      pygame.display.set_icon(icone)
                      pygame.display.set_caption(titre_fenetre)
                       
                      #Chargement et collage du fond
                      fond = pygame.image.load(image_accueil).convert()
                      fenetre.blit(fond, (0,0))
                       
                      #son
                      son = pygame.mixer.Sound(SAN_1)
                      son.play() 
                      
                      #Rafraîchissement de l'écran
                      pygame.display.flip()
                        
                      #BOUCLE ACCUEIL
                      resterac = True
                       
                      while resterac:							
                      	for event in pygame.event.get():
                      		
                      		if event.type == QUIT:
                      			resterac = False
                      			
                      		if event.type == KEYDOWN:
                      			if event.key == K_SPACE:
                      				fond = pygame.image.load(n_1).convert()
                      				fenetre.blit(fond, (0,0))
                      				jeu = True
                      				
                      				#Création du personnage
                      				
                      				perso1 = pygame.image.load(perso_face).convert_alpha()
                      				position_perso1 = perso1.get_rect()
                      				fenetre.blit(fond, (0,0))
                      				fenetre.blit(perso1, position_perso1)
                      				pygame.key.set_repeat(1, 35)
                      				
                      				pygame.display.flip()
                      				
                      				#Boucle jeu
                      				
                      				while jeu:
                      					
                      					for event in pygame.event.get():
                      					
                      						if event.type == QUIT:
                      							jeu = False
                      							
                      						if event.type == KEYDOWN:
                      							if event.key == K_w:
                      								position_perso1 = position_perso1.move(0,-10)
                      								perso1 = pygame.image.load(perso_back).convert_alpha()
                      								fenetre.blit(perso1, position_perso1)
                      								
                      							elif event.key == K_s:
                      								position_perso1 = position_perso1.move(0,10)
                      								perso1 = pygame.image.load(perso_face).convert_alpha()
                      								
                      							elif event.key == K_a:
                      								position_perso1 = position_perso1.move(-10,0)
                      								perso1 = pygame.image.load(perso_left).convert_alpha()
                      								
                      							elif event.key == K_d:
                      								position_perso1 = position_perso1.move(10,0)
                      								perso1 = pygame.image.load(perso_right).convert_alpha()
                      
                      								
                      					fenetre.blit(fond, (0,0))
                      					fenetre.blit(perso1, position_perso1)
                      					pygame.display.flip()



                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 août 2013 à 10:45:04

                        Ton mur doit être défini par un carré. A toi de savoir les dimensions et la position de ce carré.

                        Ensuite tu dois créer le carré avec pygame.Rect et stocker ce carré dans un tableau quelconque.

                        Puis lors du déplacement du personnage, tu testes si il y a collision entre position_perso1 et ton tableau avec l'exemple que j'ai donné.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 août 2013 à 11:22:50

                          Comment je fais pour connaître la position de mon carré ?

                          est-ce que je dois définir mon personnage comme un carré ? et comment faire car si je donne la position de départ de mon personnage elle ne se déplaceras pas avec lui.

                          dans monpersonnage =pygame.Rect(113232)

                          à quoi correspondent les deux premiers nombre et les deux dernier lesquels sont la position lesquels sont la taille ?

                          et si je fais un carré et que je le place, quel point du carré vas être placé aux coordonnées que j'ai indiqué ?

                          aufaite comment stocker un carré dans un tableau ??

                          -
                          Edité par Everyatis 14 août 2013 à 11:27:14

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 août 2013 à 11:59:37

                            Dans  perso1 = pygame.Rect(1, 1, 32, 32) je crois que les deux premiers sont pour la position et les autres pour la taille donc 

                            sur mon code j'ai défini mon perso comme un carré et comme je ne sais toujours pas trouver la position sur une image j'ai fait un carrés de mur à peut prés au millieu de l'image histoire de tester la collision le problème c'est que quand j'essaye de bouger ça me met une erreur :


                            voici mon code merci de trouver ce qui cloche : 

                            import pygame
                            from pygame.locals import *
                            from constantes import *
                            from tkinter import *
                             
                            # On crée une fenêtre, racine de notre interface
                            fenetre = Tk()
                            fenetre.title('Launcher Veneficus Legend 1.0 ')
                            fenetre.geometry('500x500')
                            champ_label = Label(fenetre, text="Bienvenue dans Veneficus Legend. \n \n \n \n Ce jeu a été créer par Everyatis et MAWYO. \n vous devrez déplacer votre personnage dans toutes sortes de donjons, \n rammasser des objets, \n vaincre des monstres \n ou améliorer vos armes. \n Dans un seul but : découvrir votre propre véritée. \n Ce Projet a été comencé le 08/07/2013 \n \n \n \n \n \n \n \n \n © copyright 2013")
                            bouton_quitter = Button(fenetre, text="Lancer le jeu", command=fenetre.quit)
                            bouton_quitter.pack()
                            champ_label.pack()
                            fenetre.mainloop()
                              
                            pygame.init()
                             
                            #Ouverture de la fenêtre Pygame
                            fenetre = pygame.display.set_mode((640, 480))
                            
                            #Personnalisation du jeu
                            icone = pygame.image.load(image_icone)
                            pygame.display.set_icon(icone)
                            pygame.display.set_caption(titre_fenetre)
                             
                            #Chargement et collage du fond
                            fond = pygame.image.load(image_accueil).convert()
                            fenetre.blit(fond, (0,0))
                            
                            #préparation des collisions
                            perso1 = pygame.Rect(1, 1, 27 ,32)
                            mur1 = pygame.Rect(50, 50, 100, 100)
                            mescollisions = [mur1]
                            
                            #son
                            son = pygame.mixer.Sound(SAN_1)
                            son.play() 
                            
                            #Rafraîchissement de l'écran
                            pygame.display.flip()
                              
                            #BOUCLE ACCUEIL
                            resterac = True
                             
                            while resterac:							
                            	for event in pygame.event.get():
                            		
                            		if event.type == QUIT:
                            			resterac = False
                            			
                            		if event.type == KEYDOWN:
                            			if event.key == K_SPACE:
                            				fond = pygame.image.load(n_1).convert()
                            				fenetre.blit(fond, (0,0))
                            				jeu = True
                            				
                            				#Création du personnage
                            				
                            				perso1 = pygame.image.load(perso_face).convert_alpha()
                            				position_perso1 = perso1.get_rect()
                            				fenetre.blit(fond, (0,0))
                            				fenetre.blit(perso1, position_perso1)
                            				pygame.key.set_repeat(1, 35)
                            				
                            				pygame.display.flip()
                            				
                            				#Boucle jeu
                            				
                            				while jeu:
                            					
                            					for event in pygame.event.get():
                            					
                            						if event.type == QUIT:
                            							jeu = False
                            						
                            						if event.type == KEYDOWN:
                            						
                            							if perso1.collidelist(mescollisions) == -1:
                            								position_perso1 = position_perso1.move(0,0)
                            							
                            							else:
                            							
                            								if event.key == K_w:
                            									position_perso1 = position_perso1.move(0,-10)
                            									perso1 = pygame.image.load(perso_back).convert_alpha()
                            									fenetre.blit(perso1, position_perso1)
                            								
                            								elif event.key == K_s:
                            									position_perso1 = position_perso1.move(0,10)
                            									perso1 = pygame.image.load(perso_face).convert_alpha()
                            								
                            								elif event.key == K_a:
                            									position_perso1 = position_perso1.move(-10,0)
                            									perso1 = pygame.image.load(perso_left).convert_alpha()
                            								
                            								elif event.key == K_d:
                            									position_perso1 = position_perso1.move(10,0)
                            									perso1 = pygame.image.load(perso_right).convert_alpha()
                            
                            								
                            					fenetre.blit(fond, (0,0))
                            					fenetre.blit(perso1, position_perso1)
                            					pygame.display.flip()
                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 août 2013 à 12:42:54

                              Ton personnage doit hériter de la classe pygame.sprite.Sprite pour avoir cette fonction.

                              Je ne sais pas comment expliquer plus en détail mais ton personnage doit être une classe. Par exemple dans mon code, Hero() correspond a une classe définie dans classes/hero.py
                              Tu dois faire de même avec ton personnage.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 août 2013 à 14:01:40

                                tu pourrais me donner le code de la classe de ton perso pour que je puisse m'inspirer.

                                car ce que tu me dit est assez abstrait 

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 août 2013 à 10:55:24

                                  merci, si j'ai des problème je posterai

                                  ps -  tu ne ma pas répondu à ma précédente question :

                                  Comment je fais pour connaître la position de mon carré ?

                                  dans monpersonnage =pygame.Rect(113232)

                                  à quoi correspondent les deux premiers nombre et les deux dernier lesquels sont la position lesquels sont la taille ?

                                  et si je fais un carré et que je le place, quel point du carré vas être placé aux coordonnées que j'ai indiqué ?

                                  aufaite comment stocker un carré dans un tableau ??

                                  -
                                  Edité par Everyatis 15 août 2013 à 10:56:13

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 août 2013 à 11:55:09

                                    Hummm sérieusement ? ^^"

                                    D'après ce lien :
                                    Rect(left, top, width, height) -> Rect

                                    Donc dans l'ordre gauche, haut (pour définir la position du carré) et largeur hauteur pour sa taille.

                                    Pour stocker un carré dans un tableau c'est très simple et je te l'ai déjà montré...

                                    monpersonnage = pygame.Rect(1, 1, 32, 32)
                                    monmur = pygame.Rect(50, 50, 32, 32)
                                    mondeuxiememur = pygame.Rect(100, 100, 32, 32)
                                     
                                    # On créé un liste contenant tous les carrés collisionants :
                                    # ICI STOCKAGE DANS UN TABLEAU
                                    mescollisions = [monmur, mondeuxiememur]
                                     
                                    if monpersonnage.collidelist(mescollisions) == -1:
                                        #Le personnage ne peut pas bouger ! Il est en collision !
                                    else:
                                        # Le personnage peut bouger, il n'est pas en collision



                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 août 2013 à 19:15:14

                                      C'est possible de gérer les collisions sans faire de classe à son personnage ?

                                      car sincèrement j'ai pas très bien compris sur ton lien...

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        18 août 2013 à 20:36:02

                                        Ton "personnage" doit hériter de pygame.sprite.Sprite pour avoir les fonctions relatives aux collisions...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 août 2013 à 10:58:12

                                          jai attribué à mon hero pygame.sprite.Sprite, le jeu se lance tout à l'air de fonctionner mais dès que j'essaye de bouger j'ai ce traceback :

                                          Traceback

                                          commme cette erreur apparaît seulement au moment de bouger, est-ce que cela veux dire que j'ai mal placé les lignes pour gerer les collisions ?

                                          aucune idée...

                                          mais je suppose que si j'ai fais une aussi grosse erreur elle te sauteras aux yeux ^^

                                          voici mon code : 

                                          import pygame
                                          from pygame.locals import *
                                          from tkinter import *
                                          from constantes import *
                                           
                                          # On crée une fenêtre, racine de notre interface
                                          fenetre = Tk()
                                          fenetre.title('Launcher Veneficus Legend 1.0 ')
                                          fenetre.geometry('500x500')
                                          champ_label = Label(fenetre, text="Bienvenue dans Veneficus Legend. \n \n \n \n Ce jeu a été créer par Everyatis et MAWYO. \n vous devrez déplacer votre personnage dans toutes sortes de donjons, \n rammasser des objets, \n vaincre des monstres \n ou améliorer vos armes. \n Dans un seul but : découvrir votre propre véritée. \n Ce Projet a été comencé le 08/07/2013 \n \n \n \n \n \n \n \n \n © copyright 2013")
                                          bouton_quitter = Button(fenetre, text="Lancer le jeu", command=fenetre.quit)
                                          bouton_quitter.pack()
                                          champ_label.pack()
                                          fenetre.mainloop()
                                            
                                          pygame.init()
                                          
                                          hero = pygame.sprite.Sprite
                                          
                                          #Ouverture de la fenêtre Pygame
                                          fenetre = pygame.display.set_mode((640, 480))
                                          
                                          #Personnalisation du jeu
                                          icone = pygame.image.load(image_icone)
                                          pygame.display.set_icon(icone)
                                          pygame.display.set_caption(titre_fenetre)
                                           
                                          #Chargement et collage du fond
                                          fond = pygame.image.load(image_accueil).convert()
                                          fenetre.blit(fond, (0,0))
                                          
                                          #préparation des collisions
                                          hero = pygame.Rect(1, 1, 27 ,32) #Avec cette ligne je voudrait que mon hero spawn sur ces coordonées mais sa ne marche pas
                                          mur1 = pygame.Rect(50, 50, 100, 100)
                                          mescollisions = [mur1]
                                          
                                          #son
                                          son = pygame.mixer.Sound(SAN_1)
                                          son.play() 
                                          
                                          #Rafraîchissement de l'écran
                                          pygame.display.flip()
                                            
                                          #BOUCLE ACCUEIL
                                          resterac = True
                                           
                                          while resterac:							
                                          	for event in pygame.event.get():
                                          		
                                          		if event.type == QUIT:
                                          			resterac = False
                                          			
                                          		if event.type == KEYDOWN:
                                          			if event.key == K_SPACE:
                                          				fond = pygame.image.load(n_1).convert()
                                          				fenetre.blit(fond, (0,0))
                                          				jeu = True
                                          				
                                          				#Création du personnage
                                          				
                                          				hero = pygame.image.load(perso_face).convert_alpha()
                                          				position_hero = hero.get_rect()
                                          				fenetre.blit(fond, (0,0))
                                          				fenetre.blit(hero, position_hero)
                                          				pygame.key.set_repeat(1, 35)
                                          				
                                          				pygame.display.flip()
                                          				
                                          				#Boucle jeu
                                          				
                                          				while jeu:
                                          					
                                          					for event in pygame.event.get():
                                          					
                                          						if event.type == QUIT:
                                          							jeu = False
                                          						
                                          						if event.type == KEYDOWN:
                                          						
                                          							if hero.collidelist(mescollisions) == -1:
                                          								position_hero = position_hero.move(0,0)
                                          							
                                          							else:
                                          							
                                          								if event.key == K_w:
                                          									position_hero = position_hero.move(0,-10)
                                          									hero = pygame.image.load(perso_back).convert_alpha()
                                          									fenetre.blit(hero, position_hero)
                                          								
                                          								elif event.key == K_s:
                                          									position_hero = position_hero.move(0,10)
                                          									hero = pygame.image.load(perso_face).convert_alpha()
                                          								
                                          								elif event.key == K_a:
                                          									position_hero = position_hero.move(-10,0)
                                          									hero = pygame.image.load(perso_left).convert_alpha()
                                          								
                                          								elif event.key == K_d:
                                          									position_hero = position_hero.move(10,0)
                                          									hero = pygame.image.load(perso_right).convert_alpha()
                                          
                                          								
                                          					fenetre.blit(fond, (0,0))
                                          					fenetre.blit(hero, position_hero)
                                          					pygame.display.flip()





                                          -
                                          Edité par Everyatis 19 août 2013 à 11:17:41

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 août 2013 à 11:49:12

                                            ...
                                            hero = pygame.sprite.Sprite
                                            ...
                                            hero = pygame.Rect(...)
                                            Tu n'as pas l'impression que tu réécris par dessus ? :)
                                            class Hero(pygame.sprite.Sprite):
                                                def __init___(self):
                                                    self.image = #Image de ton héro
                                                    self.position = pygame.Rect(...) #Position
                                            
                                            hero = Hero()

                                            Ensuite si tu veux accéder à l'image ce sera hero.image et la position hero.position

                                            Tu n'as pas l'air familier avec les principes de la POO, je te conseille de suivre le tutorial python jusqu'au bout ;)

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 août 2013 à 14:32:39

                                              Merci,

                                              J'ai fais ce que tu ma dit et dès que j'essay de bouger ça me dit :

                                              AttributeError: 'pygame.Surface' object has no attribute 'collidelist'

                                              je te joiuns mon nouveau code au cas où :

                                              import pygame
                                              from pygame.locals import *
                                              from tkinter import *
                                              from constantes import *
                                               
                                              # On crée une fenêtre, racine de notre interface
                                              fenetre = Tk()
                                              fenetre.title('Launcher Veneficus Legend 1.0 ')
                                              fenetre.geometry('500x500')
                                              champ_label = Label(fenetre, text="Bienvenue dans Veneficus Legend. \n \n \n \n Ce jeu a été créer par Everyatis et MAWYO. \n vous devrez déplacer votre personnage dans toutes sortes de donjons, \n rammasser des objets, \n vaincre des monstres \n ou améliorer vos armes. \n Dans un seul but : découvrir votre propre véritée. \n Ce Projet a été comencé le 08/07/2013 \n \n \n \n \n \n \n \n \n © copyright 2013")
                                              bouton_quitter = Button(fenetre, text="Lancer le jeu", command=fenetre.quit)
                                              bouton_quitter.pack()
                                              champ_label.pack()
                                              fenetre.mainloop()
                                                
                                              pygame.init()
                                              
                                              class hero(pygame.sprite.Sprite):
                                              	def __init__(self):
                                              		self.image_face = "images/perso_face.png"
                                              		self.image_left = "images/perso_left.png"
                                              		self.image_right = "images/perso_right.png"
                                              		self.image_back = "images/perso_back.png"
                                              		self.position = pygame.Rect(27, 32, 100, 100)
                                              hero = hero()
                                              
                                              #Ouverture de la fenêtre Pygame
                                              fenetre = pygame.display.set_mode((640, 480))
                                              
                                              #Personnalisation du jeu
                                              icone = pygame.image.load(image_icone)
                                              pygame.display.set_icon(icone)
                                              pygame.display.set_caption(titre_fenetre)
                                               
                                              #Chargement et collage du fond
                                              fond = pygame.image.load(image_accueil).convert()
                                              fenetre.blit(fond, (0,0))
                                              
                                              #préparation des collisions
                                              mur1 = pygame.Rect(50, 50, 300, 300)
                                              mescollisions = [mur1]
                                              
                                              #son
                                              son = pygame.mixer.Sound(SAN_1)
                                              son.play() 
                                              
                                              #Rafraîchissement de l'écran
                                              pygame.display.flip()
                                                
                                              #BOUCLE ACCUEIL
                                              resterac = True
                                               
                                              while resterac:							
                                              	for event in pygame.event.get():
                                              		
                                              		if event.type == QUIT:
                                              			resterac = False
                                              			
                                              		if event.type == KEYDOWN:
                                              			if event.key == K_SPACE:
                                              				fond = pygame.image.load(n_1).convert()
                                              				fenetre.blit(fond, (0,0))
                                              				jeu = True
                                              				
                                              				#Création du personnage
                                              				
                                              				hero = pygame.image.load(hero.image_face).convert_alpha()
                                              				position_hero = hero.get_rect()
                                              				fenetre.blit(fond, (0,0))
                                              				fenetre.blit(hero, position_hero)
                                              				pygame.key.set_repeat(1, 35)
                                              				
                                              				pygame.display.flip()
                                              				
                                              				#Boucle jeu
                                              				
                                              				while jeu:
                                              					
                                              					for event in pygame.event.get():
                                              					
                                              						if event.type == QUIT:
                                              							jeu = False
                                              						
                                              						if event.type == KEYDOWN:
                                              						
                                              							if hero.collidelist(mescollisions) == -1:
                                              								position_hero = position_hero.move(0,0)
                                              							
                                              							else:
                                              							
                                              								if event.key == K_w:
                                              									position_hero = position_hero.move(0,-10)
                                              									hero = pygame.image.load(hero.image_back).convert_alpha()
                                              									fenetre.blit(hero, position_hero)
                                              								
                                              								elif event.key == K_s:
                                              									position_hero = position_hero.move(0,10)
                                              									hero = pygame.image.load(hero.image_face).convert_alpha()
                                              								
                                              								elif event.key == K_a:
                                              									position_hero = position_hero.move(-10,0)
                                              									hero = pygame.image.load(hero.image_left).convert_alpha()
                                              								
                                              								elif event.key == K_d:
                                              									position_hero = position_hero.move(10,0)
                                              									hero = pygame.image.load(hero.image_right).convert_alpha()
                                              
                                              								
                                              					fenetre.blit(fond, (0,0))
                                              					fenetre.blit(hero, position_hero)
                                              					pygame.display.flip()



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 août 2013 à 14:59:43

                                                Je t'ai corrigé ton programme ici.

                                                J'ai tout commenté. Je n'aime pas prémacher le travail des gens mais tu as beaucoup de mal à comprendre les principes de la POO et je te conseille une fois de plus de suivre le tutoriel sur python jusqu'au bout. Je n'ai pas tout corrigé et je ne garanti pas que le programme tournera.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 août 2013 à 16:48:08

                                                  Merci, Merci, Merci beaucoup
                                                  pour tester la collisions je le fais reculer au lieu de l'arrêter, je crois que c'est comme ça qu'il faut faire.

                                                  mais quand je lance le jeu, j'ai une mystérieuse erreur...

                                                  line10

                                                  pygame.error No video mode has been set

                                                  voici le code histoire de l'avoir sous la main : 

                                                  import pygame
                                                  from pygame.locals import *
                                                  from tkinter import *
                                                  from constantes import *
                                                     
                                                  pygame.init()
                                                   
                                                  class hero(pygame.sprite.Sprite):
                                                      def __init__(self):
                                                          self.image_face = pygame.image.load("images/perso_face.png").convert_alpha()
                                                          self.image_left = pygame.image.load("images/perso_left.png").convert_alpha()
                                                          self.image_right = pygame.image.load("images/perso_right.png").convert_alpha()
                                                          self.image_back = pygame.image.load("images/perso_back.png").convert_alpha
                                                          self.image = self.image_face
                                                          self.position = pygame.Rect(27, 32, 100, 100)
                                                   
                                                  hero = hero()
                                                   
                                                  #Ouverture de la fenêtre Pygame
                                                  fenetre = pygame.display.set_mode((640, 480))
                                                   
                                                  #Personnalisation du jeu
                                                  icone = pygame.image.load(image_icone)
                                                  pygame.display.set_icon(icone)
                                                  pygame.display.set_caption(titre_fenetre)
                                                   
                                                  #Chargement et collage du fond
                                                  fond = pygame.image.load(image_accueil).convert()
                                                  fenetre.blit(fond, (0,0))
                                                  pygame.display.flip()
                                                   
                                                  mur1 = pygame.Rect(50, 50, 300, 300)
                                                  mescollisions = [mur1]
                                                   
                                                  #son
                                                  son = pygame.mixer.Sound(SAN_1)
                                                  son.play()
                                                   
                                                  resterac = True
                                                    
                                                  while resterac:                        
                                                      for event in pygame.event.get():
                                                           
                                                          if event.type == QUIT:
                                                              resterac = False
                                                               
                                                          if event.type == KEYDOWN:
                                                              if event.key == K_SPACE:
                                                                  fond = pygame.image.load(n_1).convert()
                                                                  fenetre.blit(fond, (0,0))
                                                                  jeu = True
                                                                  fenetre.blit(hero.image, hero.positon)
                                                                  pygame.key.set_repeat(1, 35)
                                                                   
                                                                  pygame.display.flip()
                                                                   
                                                                  #Boucle jeu
                                                                   
                                                                  while jeu:
                                                                       
                                                                      for event in pygame.event.get():
                                                                          if event.type == QUIT:
                                                                              jeu = False
                                                                          if event.type == KEYDOWN:
                                                                              if hero.collidelist(mescollisions) == -1:
                                                                                  hero.position.x -= 1 #Il ne s'arrête pas mais recule d'un pixels
                                                                              else:
                                                                               
                                                                                  if event.key == K_w:
                                                                                      hero.position.y += 10
                                                                                      hero.image = hero.image_back
                                                                                   
                                                                                  elif event.key == K_s:
                                                                                      hero.position.y -= 10
                                                                                      hero.image = hero.image_face
                                                                                   
                                                                                  elif event.key == K_a:
                                                                                      hero.position.x -= 10
                                                                                      hero.image = hero.image_left
                                                                                   
                                                                                  elif event.key == K_d:
                                                                                      hero.position.x += 10
                                                                                      hero = hero.image_right
                                                   
                                                                                   
                                                                      fenetre.blit(fond, (0,0))
                                                                      fenetre.blit(hero.image, hero.position)
                                                                      pygame.display.flip()

                                                  -
                                                  Edité par Everyatis 19 août 2013 à 16:49:12

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 août 2013 à 17:07:13

                                                    Place ta classe après toutes les initilisations et pas avant. Ca devrait résoudre le problème.

                                                    Du genre juste avant ton while resterac.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      19 août 2013 à 17:32:26

                                                      ok, mais j'ai une nouvelle erreur quand j'essaye de bouger :

                                                      Error

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 août 2013 à 21:03:44

                                                        Je me suis trompé mea culpa.

                                                        En fait c'est pygame.Rect qui possède cette fonction.

                                                        if hero.position.collidelist(mescollisions) == -1:
                                                            print("Collision !")



                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          20 août 2013 à 11:11:40

                                                          Merci pour toute l'aide que tu m'a apporté, j'ai plus appris sur les collisions ces derniers jours que le mois dernier^^

                                                          pour tester la collisions j'affiche "collision" sur l'invite de commande au moment ou le personnage va sur le mur le plus a gauche.

                                                          le personnage apparait au milieu de la fenêtre quand je lance le jeu, mais voila : je ne peux pas bouger de mon point d'origine et dès que je presse un bouton ça m'affiche à tous les coups le mot "collision" sur l'invite de commande

                                                          voici mon code :

                                                          import pygame
                                                          from pygame.locals import *
                                                          from tkinter import *
                                                          from constantes import *
                                                          
                                                          pygame.init()
                                                           
                                                          #Ouverture de la fenêtre Pygame
                                                          fenetre = pygame.display.set_mode((640, 480))
                                                           
                                                          #Personnalisation du jeu
                                                          icone = pygame.image.load(image_icone)
                                                          pygame.display.set_icon(icone)
                                                          pygame.display.set_caption(titre_fenetre)
                                                           
                                                          #Chargement et collage du fond
                                                          fond = pygame.image.load(image_accueil).convert()
                                                          fenetre.blit(fond, (0,0))
                                                          pygame.display.flip()
                                                           
                                                          mur1 = pygame.Rect(1, 1, 35, 480)
                                                          mescollisions = [mur1]
                                                           
                                                          #son
                                                          son = pygame.mixer.Sound(SAN_1)
                                                          son.play()
                                                           
                                                          resterac = True
                                                          
                                                          class hero(pygame.sprite.Sprite):
                                                              def __init__(self):
                                                                  self.image_face = pygame.image.load("images/perso_face.png").convert_alpha()
                                                                  self.image_left = pygame.image.load("images/perso_left.png").convert_alpha()
                                                                  self.image_right = pygame.image.load("images/perso_right.png").convert_alpha()
                                                                  self.image_back = pygame.image.load("images/perso_back.png").convert_alpha
                                                                  self.image = self.image_face
                                                                  self.position = pygame.Rect(300, 240, 27, 32,)
                                                          		
                                                          hero = hero()
                                                          
                                                          while resterac:                        
                                                              for event in pygame.event.get():
                                                                   
                                                                  if event.type == QUIT:
                                                                      resterac = False
                                                                       
                                                                  if event.type == KEYDOWN:
                                                                      if event.key == K_SPACE:
                                                                          fond = pygame.image.load(n_1).convert()
                                                                          fenetre.blit(fond, (0,0))
                                                                          jeu = True
                                                                          fenetre.blit(hero.image, hero.position)
                                                                          pygame.key.set_repeat(1, 35)
                                                                           
                                                                          pygame.display.flip()
                                                                           
                                                                          #Boucle jeu
                                                                           
                                                                          while jeu:
                                                                               
                                                                              for event in pygame.event.get():
                                                                                  if event.type == QUIT:
                                                                                      jeu = False
                                                                                  if event.type == KEYDOWN:
                                                                                      if hero.position.collidelist(mescollisions) == -1:
                                                                                          print("collision")
                                                                                      else:
                                                                                       
                                                                                          if event.key == K_w:
                                                                                              hero.position.y += 10
                                                                                              hero.image = hero.image_back
                                                                                           
                                                                                          elif event.key == K_s:
                                                                                              hero.position.y -= 10
                                                                                              hero.image = hero.image_face
                                                                                           
                                                                                          elif event.key == K_a:
                                                                                              hero.position.x -= 10
                                                                                              hero.image = hero.image_left
                                                                                           
                                                                                          elif event.key == K_d:
                                                                                              hero.position.x += 10
                                                                                              hero = hero.image_right
                                                           
                                                                                           
                                                                              fenetre.blit(fond, (0,0))
                                                                              fenetre.blit(hero.image, hero.position)
                                                                              pygame.display.flip()



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Gerer les collisions avec pygame

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown