Sprites, Collisions y Animations

Pygame Game Development Course

Felipe A. Moreno-Vera

Nota

En estos módulos aprenderás:

  • Qué es un Sprite, la clase pygame.sprite.Sprite, groups, y transparency
  • pygame.Rect en profundidad, tipos de collision, y collision response
  • Animation basada en frames, spritesheets, y la state machine de animation

Sprites e Imágenes

¿Qué es un Sprite?

En el desarrollo de videojuegos, un sprite es cualquier objeto visual del juego: el jugador, un enemigo, una bala, un objeto recolectable. El término viene de los chips gráficos de los años 80 que manejaban objetos 2D independientes sobre un fondo.

En Pygame, pygame.sprite.Sprite es una clase base que te da estructura para manejar los objetos del juego de forma organizada. Cada sprite tiene dos atributos obligatorios:

  • self.image → la Surface visual (el dibujo)
  • self.rect → el rectángulo que define la posición y el tamaño
 self.image            self.rect
 ┌──────────┐          ┌──────────┐
 │  pixels  │          │ x, y     │  ← position on screen
 │  (Surface│          │ w, h     │  ← width and height
 │   2D)    │          │ center   │  ← and many helper props
 └──────────┘          └──────────┘

Anatomía de un Sprite

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()           # MANDATORY: call the parent __init__

        # image: Surface with the drawing
        self.image = pygame.Surface((48, 48))
        self.image.fill((50, 120, 220))   # Solid blue

        # rect: position and size on screen
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)   # Place on screen

        # Game-specific attributes
        self.speed = 4

    def update(self):                # Called by the group every frame
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:  self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]: self.rect.x += self.speed

¿Por qué usar Sprite en lugar de variables sueltas?

Sin Sprite Con Sprite
player_x, player_y, player_img player.rect.x, player.image
Lógica dispersa por todo el código Encapsulada en la clase
Collisions manuales complicadas Automáticas con spritecollide()
Dibujar objeto por objeto group.draw(screen)

Propiedades de Rect

pygame.Rect properties:
  rect.x, rect.y      = 100, 50        ← esquina superior izquierda
  rect.width, height  = 48, 48       ← tamaño
  rect.center         = (124, 74)   ← punto central
  rect.topleft        = (100, 50)  ← alias de (x, y)
  rect.topright       = (148, 50) ← esquina superior derecha
  rect.bottomleft     = (100, 98) ← esquina inferior izquierda
  rect.right          = 148       ← borde derecho
  rect.bottom         = 98       ← borde inferior

Mover asignando cualquier propiedad:
  rect.center = (400, 300)  → centra el sprite
  rect.topright = (800, 0)  → esquina superior derecha de la pantalla

Sprite Groups

Un pygame.sprite.Group es una colección de sprites con superpoderes integrados:

all_sprites = pygame.sprite.Group()    # General group
bullets     = pygame.sprite.Group()    # Specific group
enemies     = pygame.sprite.Group()

# Adding sprites
player = Player(400, 300)
all_sprites.add(player)
bullets.add(Bullet(400, 300))

# Inside the Game Loop:
all_sprites.update()          # Calls update() on ALL sprites
all_sprites.draw(screen)      # Draws ALL sprites at once

# Remove a sprite from ALL its groups
sprite.kill()

Un sprite puede pertenecer a múltiples groups al mismo tiempo.

Cargando Imágenes

# Load from file
image = pygame.image.load("player.png")

# IMPORTANT: convert for better performance
image = image.convert()         # No transparency
image = image.convert_alpha()   # With transparency (PNG with alpha channel)

# Make one color transparent (for sprites without an alpha channel)
image.set_colorkey((255, 0, 255))  # Magenta = transparent

# Scale
image = pygame.transform.scale(image, (64, 64))

Transparency y Surfaces

Pygame tiene tres niveles de transparency:

Método Cómo funciona Uso típico
Surface.set_alpha(0-255) Transparency global de toda la Surface Fade in/out, HUDs
Surface.set_colorkey(color) Un color específico se vuelve transparente Sprites sin alpha en el PNG
convert_alpha() + PNG Canal alpha por píxel Sprites con bordes suaves

Transparency y Surfaces

Pygame tiene tres niveles de transparency:

Método Cómo funciona Uso típico
Surface.set_alpha(0-255) Transparency global de toda la Surface Fade in/out, HUDs
Surface.set_colorkey(color) Un color específico se vuelve transparente Sprites sin alpha en el PNG
convert_alpha() + PNG Canal alpha por píxel Sprites con bordes suaves
# Semi-transparent surface
surf = pygame.Surface((200, 100))
surf.set_alpha(128)   # 0 = invisible, 255 = solid
surf.fill((0, 0, 0))  # Semi-transparent black overlay

# Surface with per-pixel alpha support
surf = pygame.Surface((64, 64), pygame.SRCALPHA)
# Now you can draw with (R, G, B, A) colors
pygame.draw.circle(surf, (255, 0, 0, 180), (32, 32), 30)

Sprite — Resumen

  • Sprite = Clase base — self.image y self.rect son obligatorios
  • Group = Colección que maneja update() y draw() para todos los sprites
  • kill() = Elimina el sprite de todos sus groups (lo destruye del juego)
  • convert() = Optimiza la imagen para el display actual (mejor FPS)
  • set_alpha = Transparency global 0-255
  • SRCALPHA = Flag para una surface con canal alpha por píxel