Sprites, Collisions e Animations

Pygame Game Development Course

Felipe A. Moreno-Vera

Nota

Nestes módulos você vai aprender:

  • O que é um Sprite, a classe pygame.sprite.Sprite, groups, e transparency
  • pygame.Rect em profundidade, tipos de collision, e collision response
  • Animation baseada em frames, spritesheets, e a state machine de animation

Sprites e Imagens

O que é um Sprite?

No desenvolvimento de jogos, um sprite é qualquer objeto visual do jogo: o jogador, um inimigo, uma bala, um item coletável. O termo vem dos chips gráficos dos anos 80 que gerenciavam objetos 2D independentes sobre um fundo.

No Pygame, pygame.sprite.Sprite é uma classe base que fornece estrutura para gerenciar os objetos do jogo de forma organizada. Cada sprite tem dois atributos obrigatórios:

  • self.image → a Surface visual (o desenho)
  • self.rect → o retângulo que define a posição e o tamanho
 self.image            self.rect
 ┌──────────┐          ┌──────────┐
 │  pixels  │          │ x, y     │  ← position on screen
 │  (Surface│          │ w, h     │  ← width and height
 │   2D)    │          │ center   │  ← and many helper props
 └──────────┘          └──────────┘

Anatomia de um 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 que usar Sprite em vez de variáveis soltas?

Sem Sprite Com Sprite
player_x, player_y, player_img player.rect.x, player.image
Lógica espalhada por todo o código Encapsulada na classe
Collisions manuais complicadas Automáticas com spritecollide()
Desenhar objeto por objeto group.draw(screen)

Propriedades de Rect

pygame.Rect properties:
  rect.x, rect.y      = 100, 50        ← canto superior esquerdo
  rect.width, height  = 48, 48       ← tamanho
  rect.center         = (124, 74)   ← ponto central
  rect.topleft        = (100, 50)  ← alias de (x, y)
  rect.topright       = (148, 50) ← canto superior direito
  rect.bottomleft     = (100, 98) ← canto inferior esquerdo
  rect.right          = 148       ← borda direita
  rect.bottom         = 98       ← borda inferior

Mover atribuindo qualquer propriedade:
  rect.center = (400, 300)  → centraliza o sprite
  rect.topright = (800, 0)  → canto superior direito da tela

Sprite Groups

Um pygame.sprite.Group é uma coleção de sprites com 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()

Um sprite pode pertencer a múltiplos groups ao mesmo tempo.

Carregando Imagens

# 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 e Surfaces

Pygame tem três níveis de transparency:

Método Como funciona Uso típico
Surface.set_alpha(0-255) Transparency global de toda a Surface Fade in/out, HUDs
Surface.set_colorkey(color) Uma cor específica se torna transparente Sprites sem alpha no PNG
convert_alpha() + PNG Canal alpha por pixel Sprites com bordas suaves

Transparency e Surfaces

Pygame tem três níveis de transparency:

Método Como funciona Uso típico
Surface.set_alpha(0-255) Transparency global de toda a Surface Fade in/out, HUDs
Surface.set_colorkey(color) Uma cor específica se torna transparente Sprites sem alpha no PNG
convert_alpha() + PNG Canal alpha por pixel Sprites com bordas 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 — Resumo

  • Sprite = Classe base — self.image e self.rect são obrigatórios
  • Group = Coleção que gerencia update() e draw() para todos os sprites
  • kill() = Remove o sprite de todos os seus groups (o destrói do jogo)
  • convert() = Otimiza a imagem para o display atual (melhor FPS)
  • set_alpha = Transparency global 0-255
  • SRCALPHA = Flag para uma surface com canal alpha por pixel