Menu
CoddyTech

Arrivano i nemici

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 32 di 36.

Ora i nemici. Uno sprite Enemy riceve la propria immagine e velocità quando viene creato, così una sola classe può disegnare ogni tipo:

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

Un'ondata è composta da diversi nemici, allineati sopra la finestra in modo che entrino uno dopo l'altro, ciascuno 120 pixel sopra il precedente, a una x casuale:

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))

Il primo è centrato a y = -40, il successivo a -160 e così via: all'inizio sono tutti fuori dalla vista. Una funzione mantiene l'ondata in un unico punto; la lezione precedente la chiama per ogni ondata.

Un nemico che cade oltre il bordo inferiore deve essere eliminato. Nel ciclo principale, dopo enemies.update(), elimina ogni nemico la cui parte superiore supera 480. In seguito questo costerà una vita.

challenge icon

Sfida

Medio
  1. Aggiungi import random, carica enemy_red.png in red_image e scrivi Enemy e spawn_wave.
  2. Crea enemies = pygame.sprite.Group(), poi chiama spawn_wave(red_image, 6, 2).
  3. A ogni fotogramma, aggiorna i nemici, elimina quelli il cui rect.top supera 480 e disegnali prima dei laser.

Provalo tu

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()


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()


player = Player()
lasers = pygame.sprite.Group()
last_shot = 0

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()

    screen.fill((12, 14, 30))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame