Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probème de détection de collisions avec Pygame

Sujet résolu
    30 juin 2024 à 14:49:01

    bonjour, j'ai un petit problème avec la détection des collisions entre le joueur et les blocs de la map.

    Quand le joueur frôle un bloc à sa droite ou à sa gauche, il ne passe pas à travers, ce qui est normal, mais il y a des petits à coups à chaque bloc.

    Mon code : 

    def CheckCollisions(blockValue, objects, player):
    
            if (not blockValue == 0 and blockValue < 100):
                if (
                    player.x + player.w > x 
                    and player.x < x + blockSize 
                    and player.y + player.h >= y
                    and player.y + player.h < y + 50
                    and player.jump == False
                ):
                    player.fall = False 
                    player.y = y - player.h
                    player.velocity = 0
    
                if (
                    player.x + player.w > x 
                    and player.x < x + blockSize 
                    and player.y < y + blockSize
                    and player.y > y + blockSize - 50
                ):
                    player.y = y + blockSize
                    player.jump=False
                    player.fall=True
                    player.velocity = 0
                
                if (
                    player.x + player.w >= x
                    and player.x + player.w <= x + 50
                    and player.y + player.h > y 
                    and player.y < y + blockSize
                ):
                    player.collisions["right"] = True
                    player.x = x - player.w
    
                else: player.collisions["right"] = False
    
                if (
                    player.x <= x + blockSize
                    and player.x >= x + blockSize -50
                    and player.y + player.h > y 
                    and player.y < y + blockSize
                ):
                    player.collisions["left"] = True
                    player.x = x + blockSize
                else: player.collisions["left"] = False
    
    
                for key, value in objects.items():
                    if key == "block":
                        rect = pygame.Rect(value[0], value[1], 100, 100)
                        pygame.draw.rect(screen, (50, 50, 50), rect)
    
                    if (
                        player.x + player.w > rect.x
                        and player.x < rect.x + rect.w
                        and player.y + player.h >= rect.y
                        and player.y + player.h < rect.y + player.maxVelocity + 50
                        and player.jump == False
                    ):
                        player.fall = False 
                        player.y = rect.y - player.h
                        player.velocity = 0
    
                    if (
                        player.x + player.w > rect.x
                        and player.x < rect.x + rect.w 
                        and player.y < rect.y + rect.h
                        and player.y > rect.y + rect.h  - 50
                    ):
                        player.y = rect.y + rect.h
                        player.jump=False
                        player.fall=True
                        player.velocity = 0
                    
                    if (
                        player.x + player.w > rect.x 
                        and player.x + player.w < rect.x + rect.w + 50
                        and player.y + player.h > rect.y 
                        and player.y < rect.y + rect.h
                    ):
                        player.collisions["right"] = True
                        player.x = rect.x - player.w
    
                    else: player.collisions["right"] = False
    
                    if (
                        player.x < rect.x + rect.w
                        and player.x > rect.x + rect.w -50
                        and player.y + player.h > rect.y 
                        and player.y < rect.y + rect.h
                    ):
                        player.collisions["left"] = True
                        player.x = rect.x + rect.w
    
                    else: player.collisions["left"] = False
            
    
        for lineIndex in range(len(maps[place])):
            for blockIndex in range(len(maps[place][lineIndex])):
                x = blockIndex * blockSize
                y = lineIndex * blockSize
                blockValue = maps[place][lineIndex][blockIndex]
    
                rect = pygame.Rect(x, y, blockSize, blockSize)
    
                if not player.grab:
                    if player.rect.colliderect(rect) and blockValue == 0: player.fall = True
                if blockValue != 0: screen.blit(groundS[blockValue], rect)
                CheckCollisions(blockValue, objects, player)
    
        return player


    et  voici une petite vidéo pour mieux illustrer : 

    https://youtu.be/be9WxYZ7gB4

    Je ne sais pas si vous comprenez ce que je veux dire et j'espère qu'on voit bien sur la vidéo.

    Ruben

    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2024 à 18:30:26

      Bha les conditions il me semble , faudra pas plutôt des elif ?

      Parce que if ...>x suivi de if...>=x , y a de fortes chances que cela soit valide 2 fois d'affilée .

      -
      Edité par josmiley 30 juin 2024 à 18:30:53

      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

      Probème de détection de collisions avec Pygame

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown