Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gerer les collisions avec pygame

Collisions

Sujet résolu
    20 août 2013 à 12:06:16

    Oui enfin après ça concerne le placement de ton personnage et de tes carrés, c'est à toi de gérer ^^
    • Partager sur Facebook
    • Partager sur Twitter
      20 août 2013 à 14:27:33

      ce que je veux dire c'est que j'ai bien placé les coordonées du mur mais que je ne peux pas bouger de mon point d'origine et que ça affiche "collisions" sur l'invite de commande

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

      • Partager sur Facebook
      • Partager sur Twitter
        20 août 2013 à 15:01:52

        Tu dois essayer de chercher tout seul. Je ne vais pas te faire ton programme, je pense t'avoir donné assez de piste pour que tu puisses t'en sortir tout seul non ? =)
        • Partager sur Facebook
        • Partager sur Twitter
          20 août 2013 à 15:25:52

          oui, merci de m'avoir donner toutes ces pistes.

          j'aisserai de me debrouiller tout seul.

          je posait juste cette question car avant je pouvait ne serai-ce que se déplacer...

          • Partager sur Facebook
          • Partager sur Twitter
            21 août 2013 à 10:57:17

            Je suis un peu bloqué, car le problème c'est que pygame voit les choses d'une mauvaise manière et pense que je suis constamment en collision, donc il exécute uniquement la ligne de code if hero.position.collidelist(mescollisions): et à cause de ça je ne peux pas déplacer mon hero sur la surface de l'écran

            mon erreur doit te paraître bête mais j'ai exploré plusieurs possibilités sans succès.

            il faut que tu sache aussi que je n'est pas 21 ans comme toi^^, j'en ai que 13 --'  et que donc il y a des choses que je suis susceptibles de comprendre moins rapidement qu'une personne plus âgée que moi.

            sache aussi que tout ce que tu ma montré sur ce forum, je l'ai compris et que je pourrais le réattribuer sur d'autres programmes.

            pourrais-tu s'il te plait me dire pourquoi pygame pense que je suis constamment en collision ?

            voici mon code : 

            from pygame.locals import *
            from tkinter import *
            from constantes import *
            
            pygame.init()
             
            #Ouverture de la fenêtre Pygame
            fenetre = pygame.display.set_mode((545, 416))
             
            #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, 1, 1)
            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_right
                    self.position = pygame.Rect(85, 168, 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(T_a).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:
                                            hero.position.x -= 1 #Il ne s'arrête pas mais recule d'un pixel
                                        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 22 août 2013 à 19:36:41

            • Partager sur Facebook
            • Partager sur Twitter
              22 août 2013 à 10:44:15

              Tu pourrai placer des prints pour débuguer.
              Par exemple pour savoir si pygame considère que tu es en collision :

              if hero.position.collidelist(mescollisions) == -1:
                  hero.position.x -= 1 #Il ne s'arrête pas mais recule d'un pixel
                  print("Position Hero : %i x %i" % (hero.position.y, hero.position.x) 
                  for collision in mescollisions:
                       print("Position Colision : %i:%i" % (collision.x, collision.y)



              Enfin je dis ça...

              J'essayerai de faire tourner ton code plus tard.

              -
              Edité par Depado 22 août 2013 à 10:45:45

              • Partager sur Facebook
              • Partager sur Twitter
                23 août 2013 à 15:10:52

                J'ai fais un tour sur le web et j'ai vu que la ligne de code 

                ifhero.position.collidelist(mescollisions) ==-1:

                     hero.position.x -=1

                signifie : que s'il n'y a pas de collision alors il faut reculer d'un pixel.

                est-ce bien cela que tu voulais me dire ?

                • Partager sur Facebook
                • Partager sur Twitter
                  23 août 2013 à 18:18:31

                  j'ai réussi !!

                  je parvient à gerer les collisions.

                  le soucis c'est que je ne peux pas me déplacer vers le haut ou vers la droite.

                  sinon en bas et à gauche sa marche.

                  quand je me déplace vers le haut et la droite j'ai cette erreur : 

                  line 89, in <module>
                  fenetre.blit(hero.image, hero.position)
                  typeError: argument 1 must be pygame.Surface, not builtin_function_or_method

                  voici mon code :

                  import pygame
                  from pygame.locals import *
                  from tkinter import *
                  from Fonctions.IntroTkinter import *
                  
                  IntroTkinter()
                     
                  pygame.init()
                  
                  #Ouverture de la fenêtre Pygame
                  fenetre = pygame.display.set_mode((545, 416))
                   
                  #Personnalisation du jeu
                  icone = pygame.image.load("images/icone.png")
                  pygame.display.set_icon(icone)
                  pygame.display.set_caption("Veneficus Legend 1.0")
                   
                  #Chargement et collage du fond
                  fond = pygame.image.load("images/fond-titre.png").convert()
                  fenetre.blit(fond, (0,0))
                  pygame.display.flip()
                  
                  #Préparation des collisions
                  wall_left = pygame.Rect(1, 1, 30, 416)
                  mescollisions = [wall_left]
                   
                  #son
                  son = pygame.mixer.Sound("son/sonambiance.wav")
                  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_right
                          self.position = pygame.Rect(85, 168, 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("images/terrain_a.png").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([wall_left]) == 0:
                                                  hero.position.x += 1
                                              if hero.position.collidelist(mescollisions) == -1:
                                               
                                                  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
                    23 août 2013 à 21:19:00

                    Mon programme tourne enfin !!!

                    Merci à toi Fire4764

                    car grace à toi j'ai appris à gerer les collisions

                    ce sujet est résolu.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 août 2013 à 13:40:15

                      Si tu regardes mon programme il existe un truc plus propre pour gérer les collisions.
                      Par exemple si ton héro va en bas (donc qu'une touche est pressée), tu prends la position de ton héro actuelle et tu lui ajoutes 1 en y (par exemple) et tu regardes si cette nouvelle position est collisionnante. Si elle est collisionnante alors tu retires 1 à y. 

                      Voilà comment j'ai fait :

                      if (event.key == K_LEFT):
                          # Ici je créé un faux rectangle qui indique la position de mon héro APRÈS avoir bougé
                          testrect = pygame.Rect(angus.collision.x-2, angus.collision.y, 26, 16 )
                          # Si ce rectangle entre en collision alors ce n'est pas la peine de bouger car mon héro sera en collision !
                          # Par contre si ce rectangle n'entre pas en collision alors tout va bien, on peut déplacer le héro.
                          if testrect.collidelist(formosa.boxcollider) == -1:
                              angus.position.x -= 2
                              angus.collision.x -= 2



                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 avril 2017 à 12:05:51

                        Bonjour, j'ai le même problèmes que vous mais tout n'est pas défini ici, pourriez-vous mettre votre fichier constantes à dispositions svp?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 février 2019 à 14:02:36

                          bonjour, 

                          j'ai un petit soucis je n'arrive pas à faire afficher 2 personnages en meme temps sur mon code je suis un petit bambis aidez moi sinon je  vais avoir une mauvaise apreciation

                          CORDIALEMENT 

                          UN PROF D ICN ( DEBUTANT ) 

                          repondez avant le 12 / 02 / 2019 svp :)

                          -
                          Edité par EofjkfJfdjffj 5 février 2019 à 14:25:39

                          • 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