Menu
CoddyTech

Rechtecke sind unfair

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 21 von 36.

Steuere das Schiff mit den Pfeiltasten auf den Stachelball zu. Kollisionen mit Rects, colliderect, sind schnell und einfach, aber bei einem runden Ball täuschen sie. Das Rect des Balls ist das Quadrat um ihn herum, einschließlich der durchsichtigen Ecken, und neben der Spitze des Schiffs ist im Rect des Schiffs leerer Raum.

Mach den Test sichtbar: Zeichne den Umriss des Rects des Balls und färbe ihn entsprechend der Aussage von colliderect.

if ship_rect.colliderect(ball_rect):
    colour = (230, 60, 60)
else:
    colour = (90, 90, 120)
pygame.draw.rect(screen, colour, ball_rect, 2)

Komm dann von rechts unten auf den Ball zu. Der Umriss wird rot, obwohl noch eine deutliche Lücke aus Himmel zwischen dem Schiff und den Stacheln liegt: Die Ecken der beiden Rects überlappen sich, die Bilder jedoch nicht. In einem Spiel bedeutet das einen völlig unnötigen Lebensverlust, und die Spieler merken es.

In den nächsten Lektionen werden die Bilder selbst geprüft.

challenge icon

Aufgabe

Einfach

Zeichne nach dem Ball und dem Schiff den Umriss von ball_rect mit einer Breite von 2 Pixeln: rot (230, 60, 60), solange ship_rect damit kollidiert, andernfalls grau (90, 90, 120). Fliege dann das Schiff von rechts unten herein und beobachte die Ecken.

Probier es selbst

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Near Miss")
clock = pygame.time.Clock()

ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(topleft=(420, 320))
ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
ball_rect = ball.get_rect(center=(320, 240))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 4
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 4
    if keys[pygame.K_UP]:
        ship_rect.y -= 4
    if keys[pygame.K_DOWN]:
        ship_rect.y += 4

    screen.fill((20, 22, 40))
    screen.blit(ball, ball_rect)
    screen.blit(ship, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground