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.
Desafío
Intermedio- Escribe la clase
Enemycon__init__(self, image, x, y),update(self)ydraw(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. - Crea
enemies, una lista de tres elementos: el rojo centrado en (160, 100), el verde en (320, 100) y el amarillo en (480, 100). - 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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame