Menu
CoddyTech

Una lista di nemici

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 15 di 39.

Un nemico ora è un oggetto. Gli altri due hanno ancora bisogno dei propri Rect e blit. Inseriscili tutti e tre in una lista, come ha fatto il campo stellare con le sue stelle, e due brevi cicli li gestiranno tutti:

enemies = [Enemy(red, 100, 50), Enemy(green, 300, 50)]

for enemy in enemies:
    enemy.update()

Una lista si può scrivere elemento per elemento tra parentesi quadre, come qui, oppure creare con append in un ciclo. Ogni nemico al suo interno si muove usando il proprio Rect.

Inserisci ogni nemico nella lista una sola volta. Un nemico aggiornato anche da solo, al di fuori del ciclo, si muove due volte per ogni frame.

challenge icon

Sfida

Medio

Mantieni tutti e tre i nemici in un'unica lista.

  1. Crea enemies, una lista di tre oggetti Enemy: quello rosso al centro in (160, 100), quello verde in (320, 100) e quello giallo in (480, 100).
  2. Aggiorna ogni nemico della lista nel ciclo e disegna ognuno dopo il riempimento.
  3. Rimuovi red_enemy, i Rect verdi e gialli e le relative righe.

Premi «Gioca»: tre nemici cadono come prima. Poi premi «Verifica».

Provalo tu

import pygame

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

red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()

class Enemy:
    def __init__(self, image, x, y):
        self.image = image
        self.rect = image.get_rect(center=(x, y))
        self.speed = 2

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > 480:
            self.rect.bottom = 0

    def draw(self, screen):
        screen.blit(self.image, self.rect)


red_enemy = Enemy(red, 160, 100)
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))

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

    red_enemy.update()
    for rect in (green_rect, yellow_rect):
        rect.y += 2
        if rect.top > 480:
            rect.bottom = 0

    screen.fill((20, 22, 40))
    red_enemy.draw(screen)
    screen.blit(green, green_rect)
    screen.blit(yellow, yellow_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame