Vous utilisez un navigateur obsolète, veuillez le mettre à jour.
Veuillez utiliser un navigateur internet moderne avec JavaScript activé pour naviguer sur OpenClassrooms.com
Une question ? Pas de panique, on va vous aider !
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
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
Python c'est bon, mangez-en.
Vous pouvez rédiger votre message en Markdown ou en HTML uniquement.
Python c'est bon, mangez-en.