Criando um Jogo de Tiro com Arco no Python: Arqueiro vs Balões
Bem-vindo(a) ao post no blog.
Se você já domina o básico do Python, o próximo passo emocionante é aprender a lidar com multimídia: imagens, sons e colisões em tempo real. Hoje, na Academy Code Christ, vamos construir um jogo de ação completo onde você controla um arqueiro que deve proteger o céu!
🌟 O que aprenderemos hoje?
Gerenciamento de Assets: Como carregar imagens e sons externos.
Sistema de Som: Usar o
mixerdo Pygame para disparos e colisões.Lógica de Listas: Controlar múltiplas flechas e inimigos simultaneamente.
Colisões Dinâmicas: Detectar o exato momento em que a flecha atinge o alvo.
🛠️ Preparação dos Arquivos
Para este jogo rodar, você precisará dos seguintes arquivos na mesma pasta do seu código:
Imagens:
céu.jpg,arqueiro.png,flecha.pngebalão2.png.Sons: Crie uma pasta chamada
sonde coloquedisparo.wav,colisao com jogador.wav, etc.
💻 O Código Completo do Jogo
Aqui está a estrutura profissional para o seu jogo:
import pygame
import random
# Inicializando o pygame
pygame.init()
# Configurações da tela
tamanho_tela = (800, 600)
tela = pygame.display.set_mode(tamanho_tela)
pygame.display.set_caption("Space Shooter")
# Cores
BRANCO = (255, 255, 255)
PRETO = (0, 0, 0)
VERMELHO = (255, 0, 0)
# Carregar a imagem de fundo
fundo = pygame.image.load("céu.jpg") # Coloque o caminho da sua imagem de fundo
fundo = pygame.transform.scale(fundo, (800, 600)) # Ajuste para o tamanho da tela (800x600)
# Carregar sons
pygame.mixer.init() # Inicializa o mixer de som
som_disparo = pygame.mixer.Sound("sond/disparo.wav") # Som do disparo
som_colisao_inimigo = pygame.mixer.Sound("sond/flecha colidindo com o balão.mp3") # Som da colisão com o balão
som_colisao_jogador = pygame.mixer.Sound("sond/colisao com jogador.wav") # Som da colisão com o jogador
# Classe da nave do jogador
class Nave:
def __init__(self):
self.imagem = pygame.image.load("arqueiro.png") # Coloque o caminho da sua imagem do arquiro
self.rect = self.imagem.get_rect()
self.rect.center = (400, 550) # Inicia no centro inferior da tela
self.velocidade = 30 # Velocidade de movimento da flecha
def mover(self, esquerda, direita, cima, baixo):
if esquerda and self.rect.left > 0:
self.rect.x -= self.velocidade
if direita and self.rect.right < 800:
self.rect.x += self.velocidade
if cima and self.rect.top > 0:
self.rect.y -= self.velocidade
if baixo and self.rect.bottom < 600:
self.rect.y += self.velocidade
def desenhar(self):
tela.blit(self.imagem, self.rect)
# Classe da flecha (no lugar do flecha)
class Flecha:
def __init__(self, x, y):
self.imagem = pygame.image.load("flecha.png") # Coloque o caminho da imagem da flecha
self.imagem = pygame.transform.scale(self.imagem, (30, 100)) # Ajuste o tamanho da flecha
self.rect = self.imagem.get_rect()
self.rect.center = (x, y)
self.velocidade = 7
def mover(self):
self.rect.y -= self.velocidade # A flecha vai para cima (ajuste para movimento desejado)
def desenhar(self):
tela.blit(self.imagem, self.rect)
# Classe do inimigo
class Inimigo:
def __init__(self):
self.imagem = pygame.image.load("balão2.png") # Coloque o caminho da imagem do Balão
self.rect = self.imagem.get_rect()
self.rect.center = (random.randint(50, 750), random.randint(-100, -50)) # Posiçã o aleatória no topo
self.velocidade = 2
def mover(self):
self.rect.y += self.velocidade
def desenhar(self):
tela.blit(self.imagem, self.rect)
# Função principal do jogo
def jogo():
# Criando objetos
jogador = Nave()
flechas = [] # Agora temos uma lista de flechas, ao invés de mísseis
inimigos = [Inimigo() for _ in range(5)]
# Variáveis de controle
clock = pygame.time.Clock()
pontos = 0
vidas = 3
fim_jogo = False
# Loop principal do jogo
while not fim_jogo:
tela.fill(PRETO)
# Desenhar o fundo
tela.blit(fundo, (0, 0)) # Coloca a imagem de fundo na tela
# Movimentos do jogador
esquerda = direita = cima = baixo = False
for evento in pygame.event.get():
if evento.type == pygame.QUIT:
fim_jogo = True
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_LEFT:
esquerda = True
if evento.key == pygame.K_RIGHT:
direita = True
if evento.key == pygame.K_UP:
cima = True
if evento.key == pygame.K_DOWN:
baixo = True
if evento.key == pygame.K_SPACE:
# Disparar a flecha
flechas.append(Flecha(jogador.rect.centerx, jogador.rect.top))
som_disparo.play() # Toca o som do disparo
# Mover o arqueiro
jogador.mover(esquerda, direita, cima, baixo)
# Mover flechas
for flecha in flechas:
flecha.mover()
if flecha.rect.bottom < 0:
flechas.remove(flecha)
# Mover inimigos
for inimigo in inimigos:
inimigo.mover()
if inimigo.rect.top > 600:
inimigos.remove(inimigo)
inimigos.append(Inimigo())
# Verificar colisão com as flechas
for flecha in flechas:
if flecha.rect.colliderect(inimigo.rect):
flechas.remove(flecha)
inimigos.remove(inimigo)
inimigos.append(Inimigo())
pontos += 10
som_colisao_inimigo.play() # Toca o som da colisão com inimigo
# Verificar colisão com o jogador
if jogador.rect.colliderect(inimigo.rect):
vidas -= 1
inimigos.remove(inimigo)
inimigos.append(Inimigo())
som_colisao_jogador.play() # Toca o som da colisão com o jogador
if vidas <= 0:
fim_jogo = True
# Desenhar tudo
jogador.desenhar()
for flecha in flechas:
flecha.desenhar()
for inimigo in inimigos:
inimigo.desenhar()
# Exibir informações
fonte = pygame.font.SysFont("arial", 30)
texto_pontos = fonte.render(f"Pontos: {pontos}", True, BRANCO)
tela.blit(texto_pontos, (10, 10))
texto_vidas = fonte.render(f"Vidas: {vidas}", True, BRANCO)
tela.blit(texto_vidas, (700, 10))
# Atualizar a tela
pygame.display.flip()
clock.tick(60) # 60 FPS
pygame.quit()
# Iniciar o jogo
jogo()
🔍 Mergulhando na Lógica
1. A Orquestra de Sons 🎵
Diferente de programas comuns, um jogo precisa de feedback auditivo. Usamos o pygame.mixer.Sound para carregar o áudio na memória e o .play() para executá-lo no exato momento da ação. Isso cria imersão!
2. Movimentação Livre
Neste código, permitimos que o arqueiro se mova nas quatro direções (cima, baixo, esquerda, direita). Observe como usamos os limites da tela (800x600) para impedir que o herói saia do cenário.
3. Gestão de Memória (Listas)
Note que usamos uma lista para as flechas. Por que? Porque o jogador pode atirar várias vezes seguidas. Quando uma flecha sai da tela ou atinge um inimigo, nós a removemos da lista para não sobrecarregar o computador.
✝️ Reflexão: Precisão e Foco
Na programação, um erro de um único pixel pode fazer a flecha errar o alvo. Na nossa caminhada, a precisão também é importante. Assim como o arqueiro precisa de foco para acertar o balão, precisamos manter nossos olhos no que é correto e justo.
"Os teus olhos olhem direitinho, e as tuas pálpebras mirem defronte de ti." (Provérbios 4:25)
🏆 Desafio do Arqueiro
Conseguiu rodar? Agora tente personalizar:
Níveis de Dificuldade: Aumente a
velocidadedos inimigos conforme os pontos sobem.Poderes: Crie uma flecha especial que seja maior ou mais rápida.
Várias Vidas: Adicione uma imagem de coração para representar as vidas restantes na tela.

Comentários
Postar um comentário