Problème avec un attribut Pygame [Python]
Résolu
Enz0lanterne828
Messages postés
50
Statut
Membre
-
MYRLY -
MYRLY -
Bonsoir,
Je débute en programmation du python et en ce moment j'utilise le module Pygame.
J'ai créer une classe qui s'appelle BluePlayer:
Tout est normal pour le moment j'arrive à faire apparaître le joueur sur la fenêtre mais quand je veux créer un autre joueur comma par exemple une classe RedPlayer:
Lorsque je lance mon programme une erreur apparaît disant:
screen.blit(game.red_player.photo, game.red_player.rect)
AttributeError: type object 'RedPlayer' has no attribute 'photo'
Python me dit que la classe RedPlayer n'as pas d'attribut photo alors que si...
Je ne comprend pas...
Si vous savez pourquoi cela fait cela, pouriez-vous me le dire ?
Merci, Cordialement
Je débute en programmation du python et en ce moment j'utilise le module Pygame.
J'ai créer une classe qui s'appelle BluePlayer:
# Créer le joueur bleu
class BluePlayer(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.image = pygame.image.load('archerbleu.png')
self.rect = self.image.get_rect()
self.rect.x = 50
self.rect.y = 500
def move_right(self):
self.rect.x += self.speed
def move_left(self):
self.rect.x -= self.speed
Tout est normal pour le moment j'arrive à faire apparaître le joueur sur la fenêtre mais quand je veux créer un autre joueur comma par exemple une classe RedPlayer:
# Créer le joueur rouge
class RedPlayer(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.photo = pygame.image.load('archerrouge.png')
self.rect = self.photo.get_rect()
self.rect.x = 400
self.rect.y = 500
Lorsque je lance mon programme une erreur apparaît disant:
screen.blit(game.red_player.photo, game.red_player.rect)
AttributeError: type object 'RedPlayer' has no attribute 'photo'
Python me dit que la classe RedPlayer n'as pas d'attribut photo alors que si...
self.photo = pygame.image.load('archerrouge.png')
Je ne comprend pas...
Si vous savez pourquoi cela fait cela, pouriez-vous me le dire ?
Merci, Cordialement
A voir également:
- Problème avec un attribut Pygame [Python]
- Citizen code python avis - Accueil - Outils
- Attribut changer - Télécharger - Divers Utilitaires
- \R python ✓ - Forum Python
- Citizen code python solution - Forum Python
- Ce programme est écrit en python il construit un mot secret ✓ - Forum Python
4 réponses
Bonsoir,
Tu as forcément fait une erreur quelque part.
Comment est instancié ta classe et où ? Même fichier ? Tu n'aurais pas déclaré une autre classe de même nom que tu utiliserais au lieu de celle-là ?
Tu peux déjà regarder ce que contient ton objet game.red_player en utilisant dir
Toutefois, dans ton code, tu devrais avoir une classe Player héritant de Sprite, tes 2 classes players (bleu, rouge) héritant de Player, ici l'héritage est plus que judicieux puisque il y a exactement les mêmes propriétés dans tes classes.
Tu as forcément fait une erreur quelque part.
Comment est instancié ta classe et où ? Même fichier ? Tu n'aurais pas déclaré une autre classe de même nom que tu utiliserais au lieu de celle-là ?
Tu peux déjà regarder ce que contient ton objet game.red_player en utilisant dir
print(dir(game.red_player)).
Toutefois, dans ton code, tu devrais avoir une classe Player héritant de Sprite, tes 2 classes players (bleu, rouge) héritant de Player, ici l'héritage est plus que judicieux puisque il y a exactement les mêmes propriétés dans tes classes.
Quand j’exécute la commande avec dire, j'obtiens ce-ci:
Donc ce que vous voulez dire c'est que je peux créer une spuerclasse contenant BluePlayer et RedPlayer ?
Voilà mon programme en entier au cas ou (Personnellement je ne vois pas d’erreur mais l'erreur doit être au moment ou il y a:)
Sinon voilà le programme en entier:
Main:
Game:
Blue_Player:
red_player:
Merci pour la réponse, cordialement
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add', 'add_internal', 'alive', 'groups', 'kill', 'remove', 'remove_internal', 'update']
Donc ce que vous voulez dire c'est que je peux créer une spuerclasse contenant BluePlayer et RedPlayer ?
Voilà mon programme en entier au cas ou (Personnellement je ne vois pas d’erreur mais l'erreur doit être au moment ou il y a:)
# Appliquer l'image du joueur rouge
screen.blit(game.red_player.photo, game.red_player.rect)
Sinon voilà le programme en entier:
Main:
import pygame
import time
from game import Game
pygame.init()
# Générer la fenêtre du jeu
pygame.display.set_caption("ArcherWars")
screen = pygame.display.set_mode((1080, 720))
logo = pygame.image.load("icon.png").convert()
pygame.display.set_icon(logo)
# Importer l'arrière plan du jeu
fond = pygame.image.load('fond.jpg')
# Charger le jeu
game = Game()
run = True
# Boucle qui s'éxécute tant que run = True
while run:
# Appliquer l'arière plan du jeu
screen.blit(fond, (0, -77))
# Appliquer l'image du joueur bleu
screen.blit(game.blue_player.image, game.blue_player.rect)
# Appliquer l'image du joueur rouge
screen.blit(game.red_player.photo, game.red_player.rect)
# Vérifier si le joueur shouaite aller à gauche ou à droite
if game.pressed.get(pygame.K_f) and game.blue_player.rect.x + game.blue_player.rect.width < screen.get_width():
game.blue_player.move_right()
elif game.pressed.get(pygame.K_d) and game.blue_player.rect.x > 0:
game.blue_player.move_left()
# Mettre à jour l'écran
pygame.display.flip()
# Si le joueur ferme cette fenêtre
for event in pygame.event.get():
# Vérifier que l'évenement est fermeture de fenêtre
if event.type == pygame.QUIT:
run = False
pygame.quit()
print("Fermeture du jeu en cours veuillez patienter...")
time.sleep(2.5)
print("Le jeu à bien été fermé !")
# Détecter si un joueur lache une touche du clavier
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
Game:
import pygame
from blue_player import BluePlayer
from red_player import RedPlayer
# Créer une seconde classe qui va représenter le jeu
class Game:
def __init__(self):
# Générer le joueur quand une partie est créer
self.blue_player = BluePlayer()
self.red_player = RedPlayer
self.pressed = {}
Blue_Player:
import pygame
# Créer le joueur bleu
class BluePlayer(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.image = pygame.image.load('archerbleu.png')
self.rect = self.image.get_rect()
self.rect.x = 50
self.rect.y = 500
def move_right(self):
self.rect.x += self.speed
def move_left(self):
self.rect.x -= self.speed
red_player:
import pygame
# Créer le joueur rouge
class RedPlayer(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.photo = pygame.image.load('archerrouge.png')
self.rect = self.photo.get_rect()
self.rect.x = 400
self.rect.y = 500
Merci pour la réponse, cordialement
Bonjour,
Si j'ai instancié mon objet dans la classe game:
Et pour la classe Player dont RedPlayer et BluePlayer dériveront, comme ça ça marche ?
Je ne sais pas d'où vient le problème si tous les codes fonctionnent bien...
Merci pour vos réponses, cordialement
Si j'ai instancié mon objet dans la classe game:
mport pygame
from blue_player import BluePlayer
from red_player import RedPlayer
# Créer une seconde classe qui va représenter le jeu
class Game:
def __init__(self):
# Générer le joueur quand une partie est créer
self.blue_player = BluePlayer()
self.red_player = RedPlayer
# Ci dessus j’instancie ma classe red_player et blue_player
Et pour la classe Player dont RedPlayer et BluePlayer dériveront, comme ça ça marche ?
import pygame
import game
# Créer la super classe de joueur
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.saut = 5
# Puis quand je créer la classe RedPlayer et BluePlayer je fais ça:
import pygame
import player
# Créer le joueur rouge
class RedPlayer(player.Player):
# Ci dessus je fais dériver la classe RedPlayer de la classe Player et pareil pour la classe BluePlayer puis j'ajoute les composants supplémentaires
def __init__(self):
super().__init__()
self.photo = pygame.image.load('archerrouge.png')
self.rect = self.photo.get_rect()
self.rect.x = 400
self.rect.y = 500
Je ne sais pas d'où vient le problème si tous les codes fonctionnent bien...
Merci pour vos réponses, cordialement
Pas bien réveillé ?
Oui c'est ça pour ta classe Player, sachant que seuls le nom d'image et pos x, y varient alors ça pourrait faire
Puis
Et
Si RedPlayer doit aussi implémenter les méthodes move_* alors il faudrait les déclarer dans Player.
# Créer une seconde classe qui va représenter le jeu
class Game:
def __init__(self):
# Générer le joueur quand une partie est créer
self.blue_player = BluePlayer()
self.red_player = RedPlayer # «««««« IL MANQUE LES PARENTHÈSES !
# Ci dessus j’instancie ma classe red_player et blue_player
Oui c'est ça pour ta classe Player, sachant que seuls le nom d'image et pos x, y varient alors ça pourrait faire
class Player(class Player(pygame.sprite.Sprite):
def __init__(self, image_file, x, y):
super().__init__()
self.vie = 250
self.kick = 5
self.max_vie = 250
self.attack = 10
self.speed = 5
self.photo = pygame.image.load(image_file)
self.rect = self.photo.get_rect()
self.rect.x = x
self.rect.y = y
Puis
class BluePlayer(Player):
def __init__(self):
super().__init__('archerbleu.png', 50, 500)
def move_right(self):
self.rect.x += self.speed
def move_left(self):
self.rect.x -= self.speed
Et
class RedPlayer(Player):
def __init__(self):
super().__init__('archerrouge.png', 400, 500)
Si RedPlayer doit aussi implémenter les méthodes move_* alors il faudrait les déclarer dans Player.