Treffer und Punkte
Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 33 von 36.
Laser gegen Gegner ist eine Gruppe gegen eine Gruppe, mit groupcollide. Das Bild eines Lasers ist ein dünner Strahl in der Mitte eines 48 Pixel großen Quadrats, daher würde ein Rect-Test einen Gegner zerstören, wenn der Laser 20 Pixel daneben liegt. Teste die Bilder mit Masken:
hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
for enemy in hits:
score += 10Das fünfte Argument ist der Test, wie bei spritecollide. Weise sowohl Laser als auch Enemy jeweils ein self.mask = pygame.mask.from_surface(self.image) zu, damit die Masken einmal erstellt werden und nicht bei jedem Test.
Die Schleife über hits geht die zerstörten Gegner einzeln durch: Jeder ist 10 Punkte wert. Zeige die Punktzahl oben links mit font = pygame.font.Font(None, 32) an, das einmal vor der Schleife erstellt wird.
Aufgabe
Mittel- Gib
LaserundEnemyeinself.mask. - Setze
score = 0und erstelle vor der Schleife eine Schrift mit Größe 32. - Führe nach den Aktualisierungen eine Kollisionserkennung zwischen
enemiesundlasersmitpygame.sprite.collide_maskdurch, entferne beide und erhöhescorefür jeden getroffenen Gegner um 10. - Zeichne
Score:und den Punktestand bei(10, 10)in(240, 240, 240).
Probier es selbst
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()
class Enemy(pygame.sprite.Sprite):
def __init__(self, image, x, y, speed):
super().__init__()
self.image = image
self.rect = self.image.get_rect(center=(x, y))
self.speed = speed
def update(self):
self.rect.y += self.speed
def spawn_wave(image, count, speed):
for i in range(count):
x = random.randint(40, 600)
enemies.add(Enemy(image, x, -40 - i * 120, speed))
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
spawn_wave(red_image, 6, 2)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
keys = pygame.key.get_pressed()
now = pygame.time.get_ticks()
if keys[pygame.K_SPACE] and now - last_shot >= 250:
lasers.add(Laser(player.rect.centerx, player.rect.top))
last_shot = now
lasers.update()
enemies.update()
for enemy in enemies:
if enemy.rect.top > 480:
enemy.kill()
screen.fill((12, 14, 30))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.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 Pixel4Spriters und Gruppen
Die Sprite-KlasseGruppenMit kill() entfernenMit spritecollide abfangenGruppe gegen Gruppe7Sternenpatrouille
Das PatrouillenschiffLaser abfeuern2Drehen, 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