Problème de variable

Fermé
JulesBourillon - Modifié le 5 févr. 2022 à 10:45
yg_be Messages postés 23488 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mars 2025 - 5 févr. 2022 à 20:28
Bonjour,

Dans mon code j'aimerais que l'utilisateur puisse choisir le "skin" de son personnage. Pour cela, il devrait cliquer sur un des rectangles qui leur sont associés. Voici le code:

import pygame

class Skin:

    def __init__(self):
        self.is_playing = False
        self.numero_Perso = 0

    def choice_perso(self):
        if self.is_playing:
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    print(event.pos)
                    if event.button == 1: #Si je clique gauche
                        if 704 < event.pos[0] < 788 and 500 < event.pos[1] < 600: #Rect 1
                            self.numero_Perso = 1
                            self.is_playing = True
                        elif 858 < event.pos[0] < 927 and 500 < event.pos[1] < 600: #Rect 2
                            self.numero_Perso = 2
                            self.is_playing = True
                        elif 994 < event.pos[0] < 1080 and 500 < event.pos[1] < 600:  
#Rect 3
                            self.numero_Perso = 3
                            self.is_playing = True
                        elif 1142 < event.pos[0] < 1227 and 500 < event.pos[1] < 600:
 #Rect 4
                            self.numero_Perso = 4
                            self.is_playing = True
                        elif 704 < event.pos[0] < 788 and 645 < event.pos[1] < 742: 
#Rect 5
                            self.numero_Perso = 5
                            self.is_playing = True
                        elif 858 < event.pos[0] < 927 and 645 < event.pos[1] < 742: #Rect 6
                            self.numero_Perso = 6
                            self.is_playing = True 
                        elif 994 < event.pos[0] < 1080 and 645 < event.pos[1] < 742:  
#Rect 7
                            self.numero_Perso = 7
                            self.is_playing = True
                        elif 1142 < event.pos[0] < 1227 and 645 < event.pos[1] < 742: 
#Rect 8
                            self.numero_Perso = 8
                            self.is_playing = True
                        return self.numero_Perso

    def update(self):
        self.choice_perso()
        print(self.numero_Perso)


En cliquant sur un des rectangles, cela modifierai la valeur de la variable self.numero_Perso dans ma fonction choice_perso (qui est importé dans un autre fichier puis inséré dans la boucle While du jeu).

Ex : Si l'ulisateur veut le "skin" 4, il devra cliquer sur le rectangle 4 ce qui mettra la variable self.numero_Player a 4.

Néanmoins, lorsque ma fonction s'active je n'appuie pas tout le tant sur l'un des rectangle et dans ces cas là, la valeur de variable self.numero_Player se remet à sa valeur initiale dans __init__ soit 0. J'aimerais que lorsque j'appuie une seule fois sur l'un des rectangles, ma variable se modifie définitivement et ne change plus. Même en connaissant la base de mon problème, je n'arrive pas à trouver une solution c'est pour cela que je demande de l'aide.

J'espère que j'ai réussi à énoncer clairement mon problème

Merci d'avance.

2 réponses

yg_be Messages postés 23488 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mars 2025 Ambassadeur 1 571
5 févr. 2022 à 14:53
bonjour,
Si ce que tu décris est correct, cela signifie que tes objets Skin ne sont pas permanents.
Tu ne nous montres qu'une partie de ton code.
0
JulesBourillon
5 févr. 2022 à 15:00
Je ne suis pas sur de bien comprendre, en effet il n'y a pas tout mon code mais juste un seul fichier qui est bien entier. Pourquoi mes objets ne seraient pas permanents ?
0
yg_be Messages postés 23488 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mars 2025 1 571 > JulesBourillon
5 févr. 2022 à 15:05
Parce que, dans le reste du code, tu en crées de nouveaux au lieu d'utiliser les existants.
Ajoute peut-être un print() au moment de la création d'un objet.
0
JulesBourillon > yg_be Messages postés 23488 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mars 2025
5 févr. 2022 à 16:49
En soi le print ne me sers que pour voir la valeur de la variable. Mais je crois que le problème n'est pas la. D'apreès moi, c'est juste que lorsque ma fonction choice_perso s'active mais que je ne clique pas sur l'un des rectangles elle me renvoie la valeur de la variable que je lui donne en argument soit le self.numero_Perso initial = 0.
0
yg_be Messages postés 23488 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mars 2025 1 571 > JulesBourillon
5 févr. 2022 à 20:28
En effet, le print ne sert strictement à rien, sauf à t'aider à comprendre tes erreurs.
Ajouter un print() au moment de la création d'un objet t'aidera à comprendre quand tu crées ces objets.
Je pense que tu ne maitrises pas ce que tu as réalisé.
Comme tu ne montres qu'une petite partie, difficile de te guider plus précisément.
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
5 févr. 2022 à 16:50
Bonjour,

return self.numero_Perso ne sert à rien: les attributs des instances de classes sont accessibles à tout moment une fois définis

on peut faire print(self.numero_Perso) sans problème

D'autant que lorsque tu invoques choice_perso() tu ne récupère pas de valeur de retour

Comme ici, par exemple:

def choice_perso():
    n = 12
    return(n)
 
r = choice_perso()
print(r)


Pour faire simple, ça, ça marche:

class Skin:
  
    def __init__(self):
        self.is_playing = False
        self.numero_Perso = 0
  
    def choice_perso(self):
        self.numero_Perso = 10
 
personnage = Skin()
 
personnage.choice_perso()
print(personnage.numero_Perso)


Ca affiche 10
0