Bonjour à tous ! Je suis actuellement en train de programmer un Worms-like en Python et j'utilise pour cela la bibliothèque Pygame (je débute). J'expérimente tout d'abord le déplacement de personnage sur une plateforme ainsi que le saut et la gravité. Comme il s'agit d'un jeu type Worms, le sol n'est pas de type rectangulaire ou linéaire car il peut se détruire par endroit (et donc comporter des trous dans lesquels le personnage peut tomber).
Or voilà mon problème : Je voudrai vérifier si il y a une collision entre le personnage et le sol, je me suis orienté vers les masks et j'ai défini des masks qui suivent parfaitement les silhouettes du sol et du personnage (afin de pouvoir vérifier exactement quand le personnage touche le sol). J'ai naturellement utilisé la fonction de Pygame qui permet normalement ça :
#On charge l'image
monimage = pygame.image.load("lien/image.png").convert_alpha()
#On crée le mask de l'image
monimage_mask = pygame.mask.from_surface(monimage)
Jusqu'à là ça va... mais quand j'utilise la fonction :
#On test la collision entre les masks
pygame.sprite.collide_mask(image1_mask, image2_mask)
qui retourne une valeur booléenne, ça ne fonctionne pas et ça me retourne le message :
AttributeError: 'pygame.Rect' object has no attribute 'rect'
Alors question : faut-il mettre autre chose que des masks dans
pygame.sprite.collide_mask()
?
Faut-il transformer les images (appliquer une autre fonction ?), car je vois " sprite " mais je ne sais pas à quoi cela correspond vraiment.
Aidez-moi s'il vous plait, je cherche sur internet mais je ne trouve que des tests de collision entre masks rectangulaires et je pense que ça ne peut pas faire l'affaire.
Des solutions ? des suggestions ? des imprécisions ? Répondez-moi toute aide est la bienvenue !
Le message d'erreur est explicite. Tu passes des Rect alors que la doc dit qu'il veut des Sprite. J'attire aussi ton attention sur ces deux choses
If the sprites have a “mask” attribute, that is used as the mask, otherwise a mask is created from the sprite image. [...]
You should consider creating a mask for your sprite at load time if you are going to check collisions many times. This will increase the performance, otherwise this can be an expensive function because it will create the masks each time you check for collisions.
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
fenetre.blit(fond, (0,0))
fenetre.blit(image1.image, image1.rect)
fenetre.blit(image2.image, image2.rect)
image1.rect.y += 5
if image1.rect.y > 300:
image1.rect.y=0
#afficher l'état de la collision entre les deux sprites - TEST
test_collision = pygame.sprite.collide_rect(image1, image2)
collision_char = "Collision" if test_collision else "Pas collision"
collision = font.render(collision_char, 1, (200,200,200))
fenetre.blit(collision, (10,30))
J'ai juste corriger l'exemple que tu avais donné. Dans celui-ci, tu as utilisé pygame.sprite.collide_rect- Si tu le remplaces par pygame.sprite.collide_mask ça fonctionnera.
× 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.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.