Menu
CoddyTech

Objetos con imágenes

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 14 de 36.

Los enemigos son imágenes que se mueven sobre Rects, y el código inicial mantiene tres Rects y realiza tres blits manualmente. Una clase puede contener una imagen y su Rect juntos:

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)

La imagen se pasa como argumento, no se carga en __init__. Carga cada archivo una sola vez al principio y pasa la misma Surface a cada enemigo que la use: diez enemigos rojos comparten una misma imagen roja. Sin embargo, cada enemigo tiene su propio Rect, así que cada uno se mueve por su cuenta.

Mover al enemigo es mover su Rect, y dibujarlo es hacer un blit de su imagen en el Rect: los dos atributos que tiene cada objeto del juego en esta sección.

challenge icon

Desafío

Intermedio
  1. Escribe la clase Enemy con __init__(self, image, x, y), update(self) y draw(self, screen), como antes: el Rect centrado en (x, y), que se mueve hacia abajo 2 píxeles por fotograma y vuelve por encima del borde superior cuando queda por debajo de la ventana.
  2. Crea enemies, una lista de tres elementos: el rojo centrado en (160, 100), el verde en (320, 100) y el amarillo en (480, 100).
  3. Actualiza y dibuja cada enemigo de la lista; elimina los tres Rect.

Pruébalo tú mismo

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

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame