Menu
CoddyTech

Oggetti con immagini

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

I nemici sono immagini che si muovono su Rect, e il codice iniziale gestisce manualmente tre Rect e tre blit. Una classe può contenere insieme un’immagine e il suo Rect:

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)

L’immagine viene passata, non caricata in __init__. Carica ogni file una sola volta all’inizio e passa la stessa Surface a ogni nemico che la usa: dieci nemici rossi condividono la stessa immagine rossa. Ogni nemico ha però un proprio Rect, quindi si muove per conto suo.

Spostare il nemico significa spostare il suo Rect, mentre disegnarlo significa eseguire il blit della sua immagine sul Rect: questi sono i due attributi che ogni oggetto di gioco in questa sezione possiede.

challenge icon

Sfida

Medio
  1. Scrivi la classe Enemy con __init__(self, image, x, y), update(self) e draw(self, screen), come sopra: il Rect centrato in (x, y), che scende di 2 pixel a ogni fotogramma e torna sopra il bordo superiore quando si trova sotto la finestra.
  2. Crea enemies, una lista di tre elementi: quello rosso centrato in (160, 100), quello verde in (320, 100) e quello giallo in (480, 100).
  3. Aggiorna e disegna ogni nemico della lista; rimuovi i tre Rect.

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

red_rect = red.get_rect(center=(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

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

    screen.fill((20, 22, 40))
    screen.blit(red, red_rect)
    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