Problème pygame pour modifier un Rect

Jules_Bourillon -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
peux-tu partager du code permettant de tester cela?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
Jules_Bourillon
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Jules_Bourillon
 
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
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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