Grupos
Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 17 de 36.
Los sprites aparecen en grupos: enemigos, láseres, monedas. Un Group contiene muchos sprites y hace lo mismo con todos ellos:
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))Dos llamadas en el bucle sustituyen los bucles que escribiste para recorrer una lista:
enemies.update()
enemies.draw(screen)enemies.update() llama a update() en cada sprite del grupo. enemies.draw(screen) dibuja cada self.image de los sprites en su self.rect: por eso esos dos nombres deben ser exactos. Un sprite de un grupo no necesita tener su propio método de dibujo.
Un grupo también conoce su tamaño, len(enemies), y puedes recorrerlo con for enemy in enemies:. Dibuja el grupo después del relleno, como cualquier otra imagen.
Desafío
Intermedio- Reemplaza
enemypor un grupo llamadoenemiesque contenga cinco sprites Enemy, centrados en x = 64, 192, 320, 448 y 576, todos en y = 60. - Llama a
enemies.update()en cada fotograma. - Dibújalos con
enemies.draw(screen), después del relleno.
Pruébalo tú mismo
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Group")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_image
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y += 3
if self.rect.top > 480:
self.rect.bottom = 0
player = Player()
enemy = Enemy(320, 60)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
enemy.update()
screen.fill((20, 22, 40))
screen.blit(enemy.image, enemy.rect)
screen.blit(player.image, player.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 transparentes4Sprites y grupos
La clase SpriteGruposEliminar con kill()Detectar colisiones con spritecollideGrupo contra grupo2Girar, 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