Problème avec pygame

Fermé
Thomas - 10 juil. 2020 à 18:05
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 - 11 juil. 2020 à 13:46
Bonjour,

Je programme actuellement un jeu python pour apprendre, et j'ai un problème assez embêtant.
J'ai créer une classe Monster et je lui ai defini une image or cette derniere ne veux pas s'afficher et lors du lancement du programme, l'erreur affiché est :
"AttributeError: 'Monster' object has no attribute 'image' "

Dans mon programme il y à aussi des projectiles qui utilise la même façon d'apparaitre et eux marchent correctement.
J'ai passé 3h à chercher mais rien alors je demande de l'aide ici.

from tkinter import *
import pygame
from subprocess import call
pygame.init()

class game:

def __init__(self):
self.player = player()
self.all_monsters = pygame.sprite.Group()
self.pressed = {}
self.spawn_monster()


def spawn_monster(self):
monster = Monster()
self.all_monsters.add(monster)



class player(pygame.sprite.Sprite):

def __init__(self):
self.health = 100
self.max_health = 100
self.attack = 20
self.all_projectiles = pygame.sprite.Group()
self.image = pygame.image.load("Main.png")
self.rect = self.image.get_rect()
self.rect.x =0
self.rect.y =0

def launch_projectile(self):

self.all_projectiles.add(Projectile(self))


def right(self):
self.rect.x += x_vit

def left(self):
self.rect.x -= x_vit

def up(self):
self.rect.y -= y_vit

def down(self):
self.rect.y += y_vit


def invisible_wall():
if game.player.rect.x>170:
game.player.rect.x = 169
if game.player.rect.x <-30:
game.player.rect.x = -29
if game.player.rect.y<-10:
game.player.rect.y = -9
if game.player.rect.y > 560:
game.player.rect.y = 559


class Projectile(pygame.sprite.Sprite):
def __init__(self, player):
super().__init__()
self.velocity = 15
self.player = player
self.image = pygame.image.load('fireball.png')
self.rect = self.image.get_rect()
self.rect.x = player.rect.x + 135
self.rect.y = player.rect.y + 70

def remove(self):
self.player.all_projectiles.remove(self)

def move(self):
self.rect.x += self.velocity

if self.rect.x > 1080:
self.remove()




class Monster(pygame.sprite.Sprite):
def __init___(self, game):
super().__init__
self.health = 100
self.max_health = 100
self.attack = 5
self.image = pygame.image.load("Monster.png")
self.rect = self.image.get_rect()
self.rect.x = 10
self.rect.y = 10





screen = pygame.display.set_mode((1080,720))
pygame.display.set_caption("Test")
background = pygame.image.load("background.jpg")
game = game()
clock = pygame.time.Clock()


running = True


x_vit=10
y_vit=10

while running:

screen.blit(background, (0, 0))

screen.blit(game.player.image, game.player.rect)

for projectile in game.player.all_projectiles:
projectile.move()


game.player.all_projectiles.draw(screen)


game.all_monsters.draw(screen)

if game.pressed.get(pygame.K_RIGHT):
game.player.right()
if game.pressed.get(pygame.K_LEFT):
game.player.left()
if game.pressed.get(pygame.K_UP):
game.player.up()
if game.pressed.get(pygame.K_DOWN):
game.player.down()



invisible_wall()

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.player.launch_projectile()

elif event.type == pygame.KEYUP:
game.pressed[event.key] = False

2 réponses

yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
Modifié le 10 juil. 2020 à 18:59
bonjour, avant tout, utilise les balises de code pour nous montrer ton code:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

quand tu as le message d'erreur, n'as-tu pas aussi des information à propos des lignes affectées?

comment détermines-tu que les projectiles fonctionnent correctement?

il y a un caractère en trop dans la ligne
def __init___(self, game):
0
Merci pour la réponse.
Je suis désolé pour les balises c'est la première fois que je demande de l'aide sur ce forum je ne savais pas, souhaites-tu que je renvoie le code avec ces balises?

Et par rapport au message d'erreur il affiche "draw" qui provient de la ligne 125"
game.all_monsters.draw(screen)
"

Et pour les projectiles ils marchent car avant de créer les monstres j'ai crée les projectiles qui fonctionner parfaitement.

Et merci pour le caractère je retire ça.
0
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > Thomas
10 juil. 2020 à 21:34
si le problème n'est pas résolu, merci de poster le code modifié avec les balises.
0
J'ai refait un code plus simplifier comprenant simplement les éléments pour monster et le problème est le mémé.
AttributeError: 'Monster' object has no attribute 'image'
Et cela viens de la ligne 40 au niveau du .draw.


import pygame
pygame.init()

class game:

    def __init__(self):
        self.all_monsters = pygame.sprite.Group()
        self.pressed = {}
        self.spawn_monster()

    def spawn_monster(self):
        monster = Monster()
        self.all_monsters.add(monster)



class Monster(pygame.sprite.Sprite):
    def __init___(self):
        self.health = 100
        self.max_health = 100
        self.attack = 5
        self.image = pygame.image.load("Monster.png")
        self.rect = self.image.get_rect()
        self.rect.x = 10
        self.rect.y = 10

screen = pygame.display.set_mode((1080,720))
pygame.display.set_caption("Test")
background = pygame.image.load("background.jpg")
game = game()
clock = pygame.time.Clock()


running = True

while running:

    screen.blit(background, (0, 0))

    game.all_monsters.draw(screen)

    pygame.display.flip()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
0
yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
11 juil. 2020 à 13:46
tu n'as pas retiré le caractère en trop dans la ligne 18.
0