Bonjour je débute en Python particulièrement en pygame. Apres avoir visionné les vidéos de Graven, j'ai essayé de réaliser mon propre jeu pour que 2 joueurs s'affrontent en 1v1 en local en m'appuyant sur le code de Graven. Cependant lorsque je souhaite me déplacer ou lancer un projectile, j'ai cette erreur :
File "C:/Users/Moi/PycharmProjects/MyGame/main.py", line 39, in <module>
game.shooter.move_left()
File "C:\Users\Moi\PycharmProjects\MyGame\player.py", line 75, in move_left
if not self.game.check_collision(self, self.game.warrior):
AttributeError: 'Shooter' object has no attribute 'check_collision'
Voici le code principale :
import pygame
from game import Game
pygame.init()
pygame.display.set_caption("Destroy him")
screen = pygame.display.set_mode((625,556))
background = pygame.image.load('game/bg1.jpg')
game = Game()
running = True
while running:
screen.blit(background,(0,0))
screen.blit(game.warrior.image, game.warrior.rect)
screen.blit(game.shooter.image, game.shooter.rect)
game.warrior.update_health_bar(screen)
game.shooter.update_health_bar(screen)
for projectile in game.warrior.all_projectile:
projectile.move()
game.warrior.all_projectile.draw(screen)
if game.pressed.get(pygame.K_RIGHT) and game.shooter.rect.x + game.warrior.rect.width < screen.get_width():
game.shooter.move_right()
elif game.pressed.get(pygame.K_LEFT) and game.shooter.rect.x > 15:
game.shooter.move_left()
if game.pressed.get(pygame.K_q) and game.shooter.rect.x + game.warrior.rect.width < screen.get_width():
game.warrior.move_left()
elif game.pressed.get(pygame.K_d) and game.shooter.rect.x > 15:
game.warrior.move_right()
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
if event.key == pygame.K_SPACE:
game.shooter.launch_laser()
if event.key == pygame.K_RETURN:
game.warrior.launch_lance()
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
<Shooter sprite(in 0 groups)>
En fait, self.game est de type Shooter. Donc self.game ne possède pas de méthode .check_collision.
Pourquoi ? Voici la ligne 54 de player.py :
super().__init__(self)
Elle se simplifie en :
Player.__init__(self, self)
Or Player.__init__ a un effet intéressant :
self.game = game
Et game est ici le second argument de Player.__init__, or on sait que ce second argument est en fait self, qui contient un objet de type Shooter. Voilà comment régler cela :
class Shooter(Player, pygame.sprite.Sprite):
def __init__(self, game): # On passe un objet de type Game donc ce nom est mieux
super().__init__(game)
#self.player = shooter Honnêtement je ne sais pas ce que tu veux faire ici
à noter que d'autres erreurs t'attendent encore, donc n'hésite pas
Voila ! Si vous voyez des améliorations pour qu'il soit allégé ou autre chose, je suis preneur !
AttributeError : object has no attribute [...]
× 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.
typage structurel ftw