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.
Aufgabe
EinfachZeichne 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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel2Drehen, Spiegeln, Skalieren
Um den Mittelpunkt drehenIn Flugrichtung ausrichtenEin Bild skalierenVom Original aus drehen3Klassen für Spielobjekte
Deine erste KlasseMethodenSelf ist das ObjektEine Liste von ObjektenObjekte mit BildernEine Unterklasse6Animation mit Sprite Sheets
Ein Sprite Sheet zuschneidenEin Frame-ZählerMit Zeit animierenEine einmalige ExplosionÜbe selbstständig: Pygame-Playground