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.
Sfida
MedioMantieni tutti e tre i nemici in un'unica lista.
- 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). - Aggiorna ogni nemico della lista nel ciclo e disegna ognuno dopo il riempimento.
- 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
1Caricare immagini
Caricare un'immaginePosizionarla con un rettangoloSpostare l'immagineRipetere uno sfondoPixel trasparenti2Ruota, capovolgi, ridimensiona
Ruotare attorno al centroRivolgiti nella direzione in cui voliRidimensionare un'immagineRuotare dall'originale3Classi per gli oggetti di gioco
La tua prima classeMetodiSelf è l'oggettoUna lista di oggettiOggetti con immaginiUna lista di nemiciUna sottoclasse6Animazione con gli sprite sheet
Ritagliare uno sprite sheetUn contatore di frameAnimare con il tempoUn’esplosione a riproduzione singolaEsercitati da solo: Playground Pygame