Problème pygame pour modifier un Rect

Fermé
Jules_Bourillon - 3 mai 2022 à 11:28
yg_be Messages postés 23534 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2025 - 4 mai 2022 à 09:55
Bonjour à vous. Dans mon code, j’ai une class Decor(pygame.sprite.Sprite) me permettant d’afficher une image d’arbre. Cet arbre, je le téléporte à un endroit précis avec cette fonction (où map.get_object(f"{self.name}_spawn ») m’indique une position en fonction du nom de l’objet):

` def teleport_spawn_decor(self, map):
point = map.get_object(f"{self.name}_spawn")
self.rect[0] = point.x
self.rect[1] = point.y`
Ainsi lorsque je lance mon code l’arbre change bien de position et pourtant lorsque je print son rect, on me renvoie que self.rect[0] et [1] sont égales à 0 soit la position initiale de l’arbre. J’aimerais pouvoir modifier le rect de mon arbre pour pouvoir ensuite gérer les collisions mais je ne sais pas comment Voici la partie du code en entier si besoin:

#Fichier Decor

import pygame

class Decor(pygame.sprite.Sprite):
def __init__(self, name, map_manager, inventaire):
super().__init__()
self.name = name
self.image = pygame.image.load(f"{self.name}.png")
self.rect = self.image.get_rect()
self.map_manager = map_manager
self.inventaire = inventaire

def teleport_spawn_decor(self, map):
point = map.get_object(f"{self.name}_spawn")
self.rect[0] = point.x
self.rect[1] = point.y

class Tree(Decor):
def __init__(self, map_manager, inventaire):
super().__init__("arbre", map_manager, inventaire)

def update(self): #Fonction ensuite mise dans une boucle While
print(self.rect)

#Fichier Map

@dataclass
class Map:
name: str
decor: list[Decor]


class MapManager:

def __init__(self, screen, player):
self.is_playing = False
self.maps = dict()
self.screen = screen
self.player = player
self.current_map = "carte_Test_RPG"
self.register_map('carte_Test_RPG', decor=[
Tree(self, Inventaire)
])
self.teleport_decor()

def teleport_decor(self):
for map in self.maps:
map_data = self.maps[map]
decors = map_data.decor

for decor in decors:
decor.teleport_spawn_decor(self)

En espérant avoir été clair, je vous remercie d’avance pour vos réponses :) Jules
A voir également:

3 réponses

yg_be Messages postés 23534 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2025 Ambassadeur 1 579
3 mai 2022 à 15:06
bonjour,
peux-tu partager du code permettant de tester cela?
0
yg_be Messages postés 23534 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2025 Ambassadeur 1 579
3 mai 2022 à 15:30
Pour t'aider à comprendre:
au lieu de
print(self.rect)

fais plutôt
print(self,self.rect)

et ajoute ce même
print()
dans
teleport_spawn_decor()
.
0
En fait, c'est bizarre quand je fais print de mon rect depuis ma class Tree, il m'affiche ça:
<rect(391, 713, 150, 150)>
<rect(0, 0, 150, 150)>
<rect(391, 713, 150, 150)>
<rect(0, 0, 150, 150)>
<rect(391, 713, 150, 150)>
...

Mais quand je fais la même chose depuis ma class Decor, il m'affiche ça:
<rect(0, 0, 150, 150)>
<rect(0, 0, 150, 150)>
<rect(0, 0, 150, 150)>
...
Tu veux que je te passe une partie du code pour le tester ?
0
yg_be Messages postés 23534 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2025 1 579 > Jules_Bourillon
3 mai 2022 à 20:10
Si tu peux partager un code testable, tu es le bienvenu.
Je suppose que tu t'es assuré de pouvoir distinguer les print() suivant l'endroit où ils ont été exécutés?
En quoi est-ce bizarre? As-tu tenu compte de ma suggestion?
0
Jules_Bourillon
3 mai 2022 à 22:07
Ok j'ai essayé des trucs, quand je fais ton truc en print(self.rect[0], self.rect[1], self), j'obtiens ça:
[0, 0] <Tree Sprite(in 0 groups)>
[391.0, 713.667] <Tree Sprite(in 1 groups)>
[0, 0] <Tree Sprite(in 0 groups)>
[391.0, 713.667] <Tree Sprite(in 1 groups)>
[0, 0] <Tree Sprite(in 0 groups)>
[391.0, 713.667] <Tree Sprite(in 1 groups)>
En gros, quand je modifie le rect 1 fois, ça affiche une fois la version modifié et l'autre fois définie dans self__init__
Ce que je peux faire c'est modifié le Rect indéfiniment dans la fonction update
0
yg_be Messages postés 23534 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2025 1 579
4 mai 2022 à 09:55
ajoute quelque chose dans le print pour préciser à quel endroit il est exécuté, et affiche aussi l'id de self:
print("dans la fonction ...",self.rect[0], self.rect[1], self, id(self))
0