Pygame Maskcollide funktioniert nicht. Fehlermeldung "Player has no attribute 'rect'". Warum?

...komplette Frage anzeigen

1 Antwort

Wie die Fehlermeldung schon sagt: collide_mask() braucht ein rect Attribut, aber Du hast es nicht definiert. In __init__() muss also etwas wie

self.rect = pygame.Rect(x, y, w, h)

stehen. Ich weiß zwar nicht, was Du genau vorhast, aber ich denke, dass Du

self.rect = pygame.Rect(100, 100, player_pic.get_width(), player_pic.get_height())

brauchst und statt self.x jetzt self.rect.x verwendest (analog self.y ⇒ self.rect.y). pygame.Rect.move_ip() übernimmt dann die Aufgabe von self.x, self.y += ...:

if self.xspd > 0:
self.rect.move_ip(self.xspd//1, self.yspd//1)
if self.xspd < 0:
self.rect.move_ip((self.xspd+1)//1, self.yspd//1)


Alexo342 01.03.2017, 07:19

Wird die Kollision dann trotzdem nach der Mask berechnet? Danke schonmal im Voraus

0
ralphdieter 01.03.2017, 11:35
@Alexo342

Laut Doku wird mask verwendet, falls eine da ist. Das rect ist dagegen obligatorisch, weil es ja die Position (x,y) enthält.

Ich vermute, dass zuerst geprüft wird, ob die Rechtecke überlappen. Und die Masken werden nur im überlappenden Bereich auf gemeinsame Punkte untersucht.

1
Alexo342 01.03.2017, 15:59
@ralphdieter

Ich habe self.rect jetzt auch definiert und egal wo ich es hinpacke, es will nicht funktionieren :( Also es kommt immernoch dieselbe Fehlermeldung obwohl ich self.rect in __init__ genau so definiere. 

1
ralphdieter 02.03.2017, 09:11
@Alexo342

Dieselbe Fehlermeldung "Player has no attribute 'rect'"?

Das dürfte eigentlich nicht kommen, wenn Du self.rect gesetzt hast.

Gib mal am Anfang von grounding() self.rect und Ground.rect aus.

---

Eins ist mir unklar: Du schreibst, dass Ground eine Klasse ist. collide_mask() erwartet aber zwei Objekte als Attribut. Hier wäre klar, dass Ground.rect nicht funktioniert. Dann würde die Fehlermeldung aber 'Ground' statt 'Player' sagen.

0

Was möchtest Du wissen?