Bonjour à tous, je suis entrain de créer un platefromer en pygame ou 2 personnages : mario et luigi s'affrontent sur une map, le but est d'attaquer l'adversaire pour qu'il perdre un point et si il perd ses 3 points il a perdu, quand on clique sur une touche (espace pour mario et enter pour luigi), un projectile part, le problème est que j'ai mis comme condition : si il n'y a pas de collision entre le projectile et un perso (mario ou luigi) : le déplacement du projectile continue sinon (cela veut dire quand il y a collision ) : le perso en contacte perd un point de vie, sauf que j'ai un message d'erreur car mon système de collision est mal géré, j'ai cherché sur internet sur d'autres forum mais j'ai pas trouvé le réponse, pouvez vous m'aider svp merci bcp je voit affiche des screens ci contre :
import pygame
class Projectile(pygame.sprite.Sprite) :
def __init__(self, game, direction ,qui) :
self.image = pygame.image.load("assets/projectile.png")
self.image = pygame.transform.scale(self.image, (20, 20))
self.rect = self.image.get_rect()
self.game = game
self.player_actuel = qui
self.direction = direction
self.vitesse = 12
if qui == "mario" :
self.rect.x = self.game.player1.rect.x
self.rect.y = self.game.player1.rect.y
elif qui == "luigi" :
self.rect.x = self.game.player2.rect.x
self.rect.y = self.game.player2.rect.y
def remove(self) :
self.game.all_projectile.remove(self) #Détruire le projectile courant
def move(self) :
if self.player_actuel == "mario" :
if self.direction == "droite" :
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
if self.rect.x <= 1600 :
self.rect.x = self.rect.x + self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player1.vie -= 1
print("Collision / Suppression !")
#Ajouter bruitage vies
elif self.direction == "gauche" :
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
if self.rect.x >= 0 :
self.rect.x = self.rect.x - self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player1.vie -= 1
print("Collision / Suppression !")
elif self.player_actuel == "luigi" :
if self.direction == "droite" :
if not self.game.check_collision_sprite(self.rect, self.game.player1.rect) :
if self.rect.x <= 1600 :
self.rect.x = self.rect.x + self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player2.vie -= 1
print("Collision / Suppression !")
if self.direction == "gauche" :
if not self.game.check_collision_sprite(self.rect, self.game.player1.rect) :
if self.rect.x >= 0 :
self.rect.x = self.rect.x - self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player2.vie -= 1
print("Collision / Suppression !")
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "/home/remi/Bureau/Oufioo/main.py", line 254, in <module>
game.ajout_projectile(game.direction_player1, "mario")
File "/home/remi/Bureau/Oufioo/game.py", line 43, in ajout_projectile
self.all_projectile.add(Projectile(self, direction, qui))
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 361, in add
sprite.add_internal(self)
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 163, in add_internal
self.__g[group] = 0
AttributeError: 'Projectile' object has no attribute '_Sprite__g'
- Edité par LaCoquille33 14 novembre 2020 à 17:15:21
Je ne sais pas ce qu'il faut faire , je n'utilise jamais le module Sprite. Si tu parles anglais essayes de demander sur discord https://discord.gg/qZXhnwa4rZ
un super().__init__() dans le __init__ de Projectile
- Edité par umfred il y a environ 20 heures
OHHHH MY GOD merci beaucoup j'été partis dans des réponses complexes alors qu'il manquait en effet l'ini du sprite merci encore tu me sauves xD
ALLERT :
Je viens de régler le problème mais un nouveau (petit) vient d'apparaître, j'ai vraiment la poise xD :
cette ligne ne veut pas s'éxécuter :
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
voici le message d'erreur :
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "/home/remi/Bureau/Oufioo/main.py", line 67, in <module>
projectile.move()
File "/home/remi/Bureau/Oufioo/projectile.py", line 29, in move
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
TypeError: check_collision_sprite() takes 2 positional arguments but 3 were given
voici la fonction check_collision_sprite() qui est dans le fichier game :
def check_collision_sprite(sprite1, sprite2) : #Fonction qui retrun True si il y a collision entre sprite et sprite
return pygame.sprite.collide_rect(sprite1, sprite2)
le problème est que la j'appelle la fonction check collision sprite en mettant soit disant 3 paramètres alors que je devrai en donner que 2, or j'en donne que 2 (self.rect et self.game.player2.rect) pouvez vous donc m'expliquer d'ou vient le problème svp merci bcp
- Edité par LaCoquille33 28 novembre 2020 à 11:16:14
Merci oui en effet c ca sauf qu'il y a encore un autre problème :
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "/home/remi/Bureau/Oufioo/main.py", line 67, in <module>
projectile.move()
File "/home/remi/Bureau/Oufioo/projectile.py", line 29, in move
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
File "/home/remi/Bureau/Oufioo/game.py", line 46, in check_collision_sprite
return pygame.sprite.collide_rect(sprite1, sprite2)
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 1310, in collide_rect
return left.rect.colliderect(right.rect)
AttributeError: 'pygame.Rect' object has no attribute 'rect'
➜ Oufioo /usr/bin/python3 /home/remi/Bureau/Oufioo/main.py
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "/home/remi/Bureau/Oufioo/main.py", line 67, in <module>
projectile.move()
File "/home/remi/Bureau/Oufioo/projectile.py", line 29, in move
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
File "/home/remi/Bureau/Oufioo/game.py", line 46, in check_collision_sprite
return pygame.sprite.collide_rect(sprite1, sprite2)
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 1310, in collide_rect
return left.rect.colliderect(right.rect)
AttributeError: 'pygame.Rect' object has no attribute 'rect'
voici la fonction :
def check_collision_sprite(self, sprite1, sprite2) : #Fonction qui retrun True si il y a collision entre sprite et sprite
return pygame.sprite.collide_rect(sprite1, sprite2)
et ou je l'appelle :
def move(self) :
if self.player_actuel == "mario" :
if self.direction == "droite" :
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
if self.rect.x <= 1600 :
self.rect.x = self.rect.x + self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player1.vie -= 1
print("Collision / Suppression !")
#Ajouter bruitage vies
elif self.direction == "gauche" :
if not self.game.check_collision_sprite(self.rect, self.game.player2.rect) :
if self.rect.x >= 0 :
self.rect.x = self.rect.x - self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player1.vie -= 1
print("Collision / Suppression !")
elif self.player_actuel == "luigi" :
if self.direction == "droite" :
if not self.game.check_collision_sprite(self.rect, self.game.player1.rect) :
if self.rect.x <= 1600 :
self.rect.x = self.rect.x + self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player2.vie -= 1
print("Collision / Suppression !")
if self.direction == "gauche" :
if not self.game.check_collision_sprite(self.rect, self.game.player1.rect) :
if self.rect.x >= 0 :
self.rect.x = self.rect.x - self.vitesse
else :
self.remove()
print("Suppression !")
else :
self.remove()
self.game.player2.vie -= 1
print("Collision / Suppression !")
le message est parlant,non ? la fonction pygame.sprite.collide_rect attend des objets qui ont des rect, mais pas des rect (qui n'ont pas cet attribut, puisqu'ils sont cet attribut)
Il faut donc que tu supprimes le .rect dans tes appels à check_collision_sprite
Bonjour je suis un humain ! Enfin peut-être que nous vivons dans un univers virtuel et que
ce qu'on croit être, n'est pas ??!!!!
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Bonjour je suis un humain ! Enfin peut-être que nous vivons dans un univers virtuel et que
ce qu'on croit être, n'est pas ??!!!!