Peter schlug vor, und man dachte, es auch heraus, dass es einfacher ist, mit Rects statt Positionen zu arbeiten, wenn sie mit Kollisionserkennung zu tun.
Ich würde diesen einen Schritt weiter gehen: immer mit Sprites arbeiten!
Mit Sprites erhalten Sie Zugriff auf alle diese praktischen Kollisionserkennungsfunktionen in pygame.sprite
. Und wenn Sie sich dazu entschließen, das Bild zu verschieben, ist es viel einfacher, die Position zu aktualisieren und zu animieren. Es enthält auch die Bildoberfläche, alles in einem einzigen Objekt. Nicht zu erwähnen Sprite Gruppen!
Sprites haben auch ein .rect
Attribut, so dass Sie immer geringe rect Manipulation tun können, wenn Sie wollen mit mysprite.rect
Das heißt, hier ist, wie Sie ein Sprite aus Ihrem Bild zu bekommen:
image_one = pygame.sprite.Sprite()
image_one.image = pygame.image.load("image_one.png").convert()
image_one.rect = pygame.Rect((image_x, image_y), image_one.image.get_size())
erstellen mehr Sprites für image_two
, _three
usw. oder eine Funktion (oder, noch besser, Unterklasse Sprite
) erstellen, die Position und den Dateinamen als Argumente empfangen, so dass Sie Sprites in einer einzigen Linie erstellen kann als:
image_two = MySprite(filename, x, y)
Jetzt können Sie gruppieren optional:
my_images = pygame.sprite.Group(image_one, image_two, image_three)
Zeichnung ist so einfach wie:
my_images.draw(screen)
Das alle Bilder auf einmal blitten wird, von denen jeder in ihrer eigene Positionen! Cool was?
ist ein "fake" Sprite für Mauszeigers Lassen Sie erstellen:
mouse = pygame.sprite.Sprite()
mouse.rect = pygame.Rect(pygame.mouse.get_pos(), (1, 1))
ich es ein 1x1 Sprite gemacht haben, so dass es nur auf Maus-Hotspot kollidieren. Beachten Sie, dass es kein .image
Attribut (daher "falsches" Sprite) hat, aber pygame ist es egal, da wir es sowieso nicht zeichnen werden.
Und nun das Beste:
imagehit = pygame.sprite.spritecollideany(mouse, my_images)
print imagehit
In einer einzigen Zeile Sie Kollision gegen getestet Alle Bilder, und nicht nur Sie wissen, wenn die Maus mit jeder kollidierte, sondern auch welches hat es getan!
Es lohnt sich wirklich, Sprites zu verwenden;)
Ausgezeichnete Hilfe! Ich habe einen noch einfacheren Weg gefunden, es zu lösen. Wenn Sie ein Bild auf einen Bildschirm "blit", gibt es ein Rect zurück. Sie ordnen einfach eine Variable zu, die gleich diesem Rect ist, z. B. FirstL_Rect = screen.blit (image_one, (185,400)), und führen dann die Kollisionserkennung mit der Funktion "colliderect" durch. Sie können Ihre mous auch in ein rect verwandeln, indem Sie einfach folgendes tun: mousecoords = pygame.mouse.get_pos() coordinateRect = Rect (mousecoords [0], mousecoords [1], 10, 10) – Parseltongue
Nice one. Ich hatte nicht bemerkt, dass Blitting ein Rect zurückgibt. Das ist sehr nützlich zu wissen. –
@Parseltongue: Sie müssen nicht das von '.blit()' zurückgegebene rect verwenden: 'image_one' ist eine * Surface *, und als solche können Sie immer mit 'image_one.get_rect()' rect abrufen. Keine Notwendigkeit, blit überhaupt;) – MestreLion