Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/07/2021, à 09:52

chris7522

NameError: ma variable n'est pas definit ?

Bonjour a toutes et a tous ,
      Je sollicite votre aide pour quelque chose sur lequel je bloque .
      Voici ma classe :

import pygame

#creer une classe qui s'occuper des animations
class AnimateSprite(pygame.sprite.Sprite):

    #definir les choses a faire a la creation de l'entité
    def __init__(self,sprite_name):
        super().__init__()
        self.image = pygame.image.load(f'assets/{sprite_name}.png')
        #commence l'anim a image 0
        self.current_image = 0 
        self.images = animations.get(sprite_name)
        
    #definir une methode pour animer le sprite
    def animate(self):
        #passer a l'image suivante
        self.current_image += 1
        
        #verifier si on atteint la fin de l'animation
        if self.current_image >= len(self.images):
            #remettre l'anim au depart
            self.current_image = 0
            
        #actualiser l'image precedente par la suivante
        self.image = self.images[self.current_image]
        
    
    def load_animation_images(sprite_name):
        #charger les 24 images du sprite dans le dossier
        images = []
        #recuperer le chemin du dossier pour ce sprite
        path = f"assets/{sprite_name}/{sprite_name}"
        
        #boucler sur chaque image dans ce dossier
        for num in range(1,24):
            image_path = path + str(num)+ '.png'
            images.append(pygame.image.load(image_path))
            
        #renvoyer le contenu de la liste d'images
        return images
            
        
    #definir un dictionnaire qui va contenir les images chargées
    #de chaque sprite
    animations = {
        'mummy': load_animation_images('mummy')
    }
    

Lorsque je lance mon main.py , j'ai ce message :

chris@chris:~/Bureau/Sauvegarde/copie3$ python3 main.py 
pygame 2.0.1 (SDL 2.0.14, Python 3.8.10)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "main.py", line 73, in <module>
    game.start()
  File "/home/chris/Bureau/Sauvegarde/copie3/game.py", line 24, in start
    self.spawn_monster()
  File "/home/chris/Bureau/Sauvegarde/copie3/game.py", line 83, in spawn_monster
    monster = Monster(self)
  File "/home/chris/Bureau/Sauvegarde/copie3/monster.py", line 8, in __init__
    super().__init__("mummy")
  File "/home/chris/Bureau/Sauvegarde/copie3/animation.py", line 12, in __init__
    self.images = animations.get(sprite_name)
NameError: name 'animations' is not defined
chris@chris:~/Bureau/Sauvegarde/copie3$ 

Cela doit etre evident pour vous , mais je ne vois pas ou j'ai fauté . Peut etre une indentation ?
D'avance , merci de votre aide

Hors ligne

#2 Le 30/07/2021, à 12:30

Nuliel

Re : NameError: ma variable n'est pas definit ?

Salut,
Du fait de l'indentation, animations est défini dans ta classe, et surtout après ta fonction, il faut le mettre avant les fonctions de ta classe, et il faut aussi rajouter "self." devant pour que ce soit relatif à ton objet (cela dépend probablement d'où tu le définis, habituellement je mets ça dans la fonction init)

Dernière modification par Nuliel (Le 30/07/2021, à 12:34)


[ poster un retour de commande ] [ poster une photo ]
Thinkpad x220, Dell latitude E7270 (i7 6600U, 16 Go de RAM, ...), Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Mon nouveau blog: nuliel.fr

Hors ligne

#3 Le 30/07/2021, à 18:51

chris7522

Re : NameError: ma variable n'est pas definit ?

Bonjour et merci de ton aide .
J'ai placé mon dico après l'initialisation et avant ma 1 ère fonction , précédé de self.   , mais ça ne fonctionne pas . Je ne comprends pas .
Ça doit pas être grand chose pourtant .

Hors ligne

#4 Le 30/07/2021, à 19:21

Nuliel

Re : NameError: ma variable n'est pas definit ?

A mon avis le plus simple est de mettre self.animations dans la fonction __init__


[ poster un retour de commande ] [ poster une photo ]
Thinkpad x220, Dell latitude E7270 (i7 6600U, 16 Go de RAM, ...), Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Mon nouveau blog: nuliel.fr

Hors ligne

#5 Le 31/07/2021, à 10:06

chris7522

Re : NameError: ma variable n'est pas definit ?

Ca ne fonctionne pas non plus , mais c'est pas grave , je vais tout reprendre depuis le debut .
Merci de ton aide .
Bon week-end

Hors ligne

#6 Le 01/08/2021, à 07:38

chris7522

Re : NameError: ma variable n'est pas definit ?

Pour information, je n'avais pas correctement indenté ma fonction load_animation_images , en fait , il ne fallait pas d'indentation .
   J'aurai pu mettre cela  dans mon __init__ ,  mais lorsque que je vais creer un nouveau monstre ou un nouveau joueur , je vais charger a  chaque fois mes 24 images , cela risque de bugger et de baisser les performances .
    Donc , je dois creer ma fonction load_animation_images dans le meme fichier mais a l'exterieur de ma classe . Il reste plus qu'a l'appeler ensuite .

Hors ligne

#7 Le 01/08/2021, à 10:25

Nuliel

Re : NameError: ma variable n'est pas definit ?

Ok, je pensais que cette fonction devait faire partie de la classe.


[ poster un retour de commande ] [ poster une photo ]
Thinkpad x220, Dell latitude E7270 (i7 6600U, 16 Go de RAM, ...), Thinkstation E32 modifié: i5-4570, GTX 1060 6 Gb, 16 Gb de RAM, ...
Mon nouveau blog: nuliel.fr

Hors ligne

#8 Le 02/08/2021, à 08:02

pseudofab

Re : NameError: ma variable n'est pas definit ?

chris7522 a écrit :

Pour information, je n'avais pas correctement indenté ma fonction load_animation_images , en fait , il ne fallait pas d'indentation .
   J'aurai pu mettre cela  dans mon __init__ ,  mais lorsque que je vais creer un nouveau monstre ou un nouveau joueur , je vais charger a  chaque fois mes 24 images , cela risque de bugger et de baisser les performances .
    Donc , je dois creer ma fonction load_animation_images dans le meme fichier mais a l'exterieur de ma classe . Il reste plus qu'a l'appeler ensuite .

Bonjour,
Tout cela appartient au choix du programmeur... Tu pourrais très bien initialiser l'ensemble de tes personnages dans l'__init__ (c'est ce que je ferais...) .
Lorsque tu instancies ta classe, il n'y aura qu'un appel à l'__init__.
Lorsque tu utilises les méthodes de la classe, l'__init__ n'est pas rappelé...

Dans tous les cas, je te conseille vivement de réfléchir à la structure de ton jeu . Définis-la, stylo à la main, avant même de coder quoi que ce soit. Sinon tu vas vite te perdre et te retrouver avec un code impossible à débugger.

édit: orthographe

Dernière modification par pseudofab (Le 02/08/2021, à 10:10)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#9 Le 04/08/2021, à 06:35

chris7522

Re : NameError: ma variable n'est pas definit ?

Merci beaucoup de ton aide .
En fait , je ne maitrise pas encore super bien la POO . Je suis tombé sur ce  tutoriel en vidéo qui explique tres bien pas a pas , la conception d'un petit jeu .

https://youtu.be/8J8wWxbAdFg

J'ai compris toutes les explications jusqu'a present mais je ne suis pas du tout capable de faire ca de moi meme ! Je devrai peut etre visé des choses a mon niveau et en meme temps cela m'a permis d'apprendre des choses nouvelles .

Dernière modification par chris7522 (Le 04/08/2021, à 06:37)

Hors ligne