Módulo 2 8 horas Intermediário

Desenvolvimento de Jogos Básicos

Entre no mundo dos jogos 2D com Pygame e crie seu primeiro jogo completo

Desenvolvimento de Jogos Básicos
Progresso: 0/10 (0%)

Objetivos do Módulo

Agora que você domina os fundamentos da programação, é hora de criar algo visual e interativo! Neste módulo, você vai aprender a desenvolver jogos 2D usando a biblioteca Pygame, uma das ferramentas mais populares para criação de jogos em Python.

O que você vai aprender:

  • Biblioteca Pygame
  • Sistema de coordenadas 2D
  • Renderização de gráficos
  • Captura de eventos (teclado/mouse)
  • Detecção de colisões
  • Sistema de pontuação
  • Game loop
  • Sprites e animações

O que você vai criar:

  • Janela de jogo básica
  • Objetos móveis na tela
  • Sistema de controles
  • Jogo Pong completo
  • Jogo Snake (cobra)

2.1 Primeiros Passos com Pygame

O que é Pygame?

Pygame é uma biblioteca Python criada para facilitar o desenvolvimento de jogos. Ela fornece funções para desenhar gráficos, tocar sons, detectar colisões e muito mais. É perfeita para iniciantes aprenderem desenvolvimento de jogos!

💡 Instalando o Pygame

Abra o terminal ou prompt de comando e digite:

pip install pygame

Para verificar se instalou corretamente:

python -c "import pygame; print(pygame.ver)"

Criando Sua Primeira Janela

Para Leigos:

Vamos criar uma janela vazia que fica aberta até você clicar no X. É como abrir um caderno em branco onde vamos desenhar nosso jogo.

import pygame

# Inicializar o Pygame
pygame.init()

# Criar janela (largura x altura)
largura = 800
altura = 600
tela = pygame.display.set_mode((largura, altura))
pygame.display.set_caption("Meu Primeiro Jogo")

# Cores (RGB - Red, Green, Blue)
PRETO = (0, 0, 0)
BRANCO = (255, 255, 255)

# Loop principal do jogo
rodando = True
while rodando:
    # Verificar eventos
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
    
    # Pintar fundo de preto
    tela.fill(PRETO)
    
    # Atualizar tela
    pygame.display.flip()

# Encerrar Pygame
pygame.quit()
Para Técnicos:

O Pygame utiliza SDL (Simple DirectMedia Layer) como backend para renderização. O game loop segue o padrão clássico: processar eventos, atualizar estado, renderizar frame. A função display.flip() realiza double buffering para evitar flickering.

import pygame
import sys

# Inicialização e configuração
pygame.init()
clock = pygame.time.Clock()
FPS = 60

# Display
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Game Template")

# Game loop otimizado
running = True
while running:
    # Event handling
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
    
    # Update logic
    # (adicione lógica do jogo aqui)
    
    # Render
    screen.fill((0, 0, 0))
    # (adicione renderização aqui)
    pygame.display.flip()
    
    # Manter 60 FPS
    clock.tick(FPS)

pygame.quit()
sys.exit()

Sistema de Coordenadas

Em Pygame, a origem (0, 0) fica no canto superior esquerdo da tela:

  • X aumenta da esquerda para direita
  • Y aumenta de cima para baixo

Desenhando Formas Básicas

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))

# Cores
VERMELHO = (255, 0, 0)
VERDE = (0, 255, 0)
AZUL = (0, 0, 255)
AMARELO = (255, 255, 0)

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
    
    tela.fill((0, 0, 0))
    
    # Retângulo: pygame.draw.rect(tela, cor, (x, y, largura, altura))
    pygame.draw.rect(tela, VERMELHO, (50, 50, 100, 80))
    
    # Círculo: pygame.draw.circle(tela, cor, (x_centro, y_centro), raio)
    pygame.draw.circle(tela, VERDE, (400, 300), 50)
    
    # Linha: pygame.draw.line(tela, cor, (x1, y1), (x2, y2), espessura)
    pygame.draw.line(tela, AZUL, (600, 100), (700, 200), 5)
    
    # Polígono (triângulo)
    pontos = [(300, 100), (250, 200), (350, 200)]
    pygame.draw.polygon(tela, AMARELO, pontos)
    
    pygame.display.flip()

pygame.quit()

2.2 Desenvolvimento de Jogo 2D Simples

Capturando Eventos de Teclado

Vamos fazer um quadrado que se move com as setas do teclado:

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# Posição do jogador
jogador_x = 400
jogador_y = 300
velocidade = 5

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
    
    # Capturar teclas pressionadas
    teclas = pygame.key.get_pressed()
    
    if teclas[pygame.K_LEFT] or teclas[pygame.K_a]:
        jogador_x -= velocidade
    if teclas[pygame.K_RIGHT] or teclas[pygame.K_d]:
        jogador_x += velocidade
    if teclas[pygame.K_UP] or teclas[pygame.K_w]:
        jogador_y -= velocidade
    if teclas[pygame.K_DOWN] or teclas[pygame.K_s]:
        jogador_y += velocidade
    
    # Limitar à tela
    jogador_x = max(0, min(jogador_x, 750))
    jogador_y = max(0, min(jogador_y, 550))
    
    tela.fill((0, 0, 0))
    pygame.draw.rect(tela, (0, 255, 0), (jogador_x, jogador_y, 50, 50))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Detecção de Colisões

Colisões são essenciais em jogos. Vamos usar retângulos (Rect) do Pygame:

import pygame

pygame.init()
tela = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# Objetos como retângulos
jogador = pygame.Rect(100, 250, 50, 50)
obstáculo = pygame.Rect(400, 250, 50, 50)
moeda = pygame.Rect(600, 250, 30, 30)

pontos = 0
velocidade = 5

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
    
    teclas = pygame.key.get_pressed()
    if teclas[pygame.K_LEFT]:
        jogador.x -= velocidade
    if teclas[pygame.K_RIGHT]:
        jogador.x += velocidade
    if teclas[pygame.K_UP]:
        jogador.y -= velocidade
    if teclas[pygame.K_DOWN]:
        jogador.y += velocidade
    
    # Detectar colisão com obstáculo
    if jogador.colliderect(obstáculo):
        print("Colidiu com obstáculo!")
        jogador.x = 100
        jogador.y = 250
    
    # Detectar colisão com moeda
    if jogador.colliderect(moeda):
        pontos += 10
        moeda.x = 600  # Reposicionar moeda
        print(f"Pontos: {pontos}")
    
    tela.fill((0, 0, 0))
    pygame.draw.rect(tela, (0, 255, 0), jogador)      # Verde - Jogador
    pygame.draw.rect(tela, (255, 0, 0), obstáculo)    # Vermelho - Obstáculo
    pygame.draw.rect(tela, (255, 255, 0), moeda)      # Amarelo - Moeda
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Projeto: Jogo Pong Completo

Vamos criar o clássico jogo Pong!

import pygame
import random

pygame.init()

# Constantes
LARGURA = 800
ALTURA = 600
BRANCO = (255, 255, 255)
PRETO = (0, 0, 0)

tela = pygame.display.set_mode((LARGURA, ALTURA))
pygame.display.set_caption("PONG")
clock = pygame.time.Clock()
fonte = pygame.font.Font(None, 74)
fonte_pequena = pygame.font.Font(None, 36)

# Raquetes
raquete1 = pygame.Rect(50, ALTURA // 2 - 60, 15, 120)
raquete2 = pygame.Rect(LARGURA - 65, ALTURA // 2 - 60, 15, 120)

# Bola
bola = pygame.Rect(LARGURA // 2 - 15, ALTURA // 2 - 15, 20, 20)
bola_dx = 5 * random.choice([1, -1])
bola_dy = 5 * random.choice([1, -1])

# Placar
pontos1 = 0
pontos2 = 0

def resetar_bola():
    global bola_dx, bola_dy
    bola.center = (LARGURA // 2, ALTURA // 2)
    bola_dx = 5 * random.choice([1, -1])
    bola_dy = 5 * random.choice([1, -1])

rodando = True
while rodando:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            rodando = False
    
    # Controles
    teclas = pygame.key.get_pressed()
    if teclas[pygame.K_w] and raquete1.top > 0:
        raquete1.y -= 7
    if teclas[pygame.K_s] and raquete1.bottom < ALTURA:
        raquete1.y += 7
    if teclas[pygame.K_UP] and raquete2.top > 0:
        raquete2.y -= 7
    if teclas[pygame.K_DOWN] and raquete2.bottom < ALTURA:
        raquete2.y += 7
    
    # Movimento da bola
    bola.x += bola_dx
    bola.y += bola_dy
    
    # Colisão com topo e base
    if bola.top <= 0 or bola.bottom >= ALTURA:
        bola_dy *= -1
    
    # Colisão com raquetes
    if bola.colliderect(raquete1) or bola.colliderect(raquete2):
        bola_dx *= -1
    
    # Pontuação
    if bola.left <= 0:
        pontos2 += 1
        resetar_bola()
    if bola.right >= LARGURA:
        pontos1 += 1
        resetar_bola()
    
    # Desenhar
    tela.fill(PRETO)
    pygame.draw.rect(tela, BRANCO, raquete1)
    pygame.draw.rect(tela, BRANCO, raquete2)
    pygame.draw.ellipse(tela, BRANCO, bola)
    pygame.draw.aaline(tela, BRANCO, (LARGURA // 2, 0), (LARGURA // 2, ALTURA))
    
    # Placar
    texto1 = fonte.render(str(pontos1), True, BRANCO)
    texto2 = fonte.render(str(pontos2), True, BRANCO)
    tela.blit(texto1, (LARGURA // 4, 50))
    tela.blit(texto2, (3 * LARGURA // 4, 50))
    
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

🎮 Desafio: Melhorias para o Pong

  • Adicione um menu inicial
  • Implemente sons (bip ao colidir)
  • Aumente a velocidade gradualmente
  • Adicione power-ups
  • Crie um modo single-player (IA)

📋 Checklist de Progresso do Módulo 2

🎮 Pronto para Revisar?

Agora que você completou o Módulo 2, visite o Observatório do Futuro para revisar todos os conceitos de Pygame e desenvolvimento de jogos através de flash cards interativos!