Menu
CoddyTech

La clase Sprite

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

Hasta ahora, todos los objetos del juego han tenido una imagen, un Rect, un update y una forma de dibujarse. pygame tiene una clase creada justo para eso: pygame.sprite.Sprite. Tus objetos del juego se convierten en subclases de ella:

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

Tres reglas. Llama primero a super().__init__(): esto configura lo que la clase Sprite necesita internamente. Llama self.image a la imagen y self.rect a la posición, exactamente así: el propio código de pygame lee esos dos nombres. Pon las reglas que se ejecutan en cada fotograma en update.

La imagen de la nave se carga una vez al principio, como ship_image, y la clase la usa. Por ahora, dibuja el sprite con un blit: screen.blit(player.image, player.rect). En la siguiente lección, pygame se encargará de dibujarlo.

challenge icon

Desafío

Intermedio
  1. Escribe class Player(pygame.sprite.Sprite) como se muestra arriba: self.image es ship_image, self.rect tiene el centro de su borde inferior en (320, 470).
  2. Su método update mueve el Rect 6 píxeles a la izquierda o a la derecha con las flechas y lo mantiene dentro de la ventana: mueve a este las líneas iniciales.
  3. Crea player = Player(), llama a player.update() en cada fotograma y dibuja player.image en player.rect.

Pruébalo tú mismo

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sprite Ship")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship_image.get_rect(midbottom=(320, 470))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 6
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 6
    ship_rect.clamp_ip(screen.get_rect())

    screen.fill((20, 22, 40))
    screen.blit(ship_image, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame