Wie mache ich eine Kollision in Pygame?

...komplette Frage anzeigen Das Spiel - (Programm, programmieren, Java)

1 Antwort

Das könnte helfen: http://www.virtual-maxim.de/pixelgenaue-kollisionserkennung/

P.S.: Die Codebeispiele sind zwar für C++ mit DirectX, aber das Prinzip dürfte sich ohne (größere) Probleme übertragen lassen.

Laurence12345 06.04.2017, 16:59

Das Problem ist aber, dass das Rechteck um das Foto nicht horizontal liegt, sondern gedreht ist und dass funktioniert dann nicht.

0
Isendrak 06.04.2017, 17:05
@Laurence12345

Normalerweise ist ne Bounding-Box immer horizontal. Nur ggf. mal größer, mal kleiner... Auf welche Weise drehst du das Bild denn?

0
Laurence12345 06.04.2017, 21:24

nach oben max. 30° und unten max 20°.

0
Isendrak 07.04.2017, 01:08
@Laurence12345

Ich meinte eigentlich, ob du pygame.transform.rotate(Surface, angle) zum drehen verwendest oder irgendwas anderes?

0
Laurence12345 07.04.2017, 09:14

Ja. ich verwende Transform.rotate

0
Isendrak 07.04.2017, 12:09
@Laurence12345

In dem Fall hast du immer noch eine horizontale Bounding-Box... Je nach Winkel nur halt mal größer, mal kleiner...

Siehe auch: https://www.pygame.org/docs/ref/transform.html#pygame.transform.rotate

Die geeignete Methode zur Kollisionserkennung wäre also:

1. Für jedes Hindernis mit pygame.mask.from_surface eine Kollisionsmaske erstellen. (Und z.B. in ner "list" speichern)

2. Das Flugzeug mit pygame.transform.rotate drehen.

3. Mit pygame.mask.from_surface eine Kollisionsmaske des (gedrehten) Flugzeugs erstellen. (Diese bis zur nächsten Rotation zwischenspeichern)

4. Mit pygame.Rect.colliderect überprüfen, ob die Bounding-Box des Flugzeugs eine Überschneidung mit der Bounding-Box eines Hindernisses hat und wenn ja, mit pygame.mask.Mask.overlap (oder pygame.mask.Mask.overlap_area) überprüfen, ob die Kollisionsmaske des Flugzeugs mit der Kollisionsmaske des Hindernisses eine Schnittmenge größer Null hat, wenn ja: "BOOM!" ;)

P.S.:
Siehe auch: https://www.pygame.org/docs/ref/mask.html

1

Was möchtest Du wissen?