Game Maker: Python com Pgzero para Crianças
Detecção de Colisão Simples (collidepoint, colliderect)
Aprenda sobre detecção de colisão simples (collidepoint, colliderect)
Detecção de Colisão Simples (collidepoint, colliderect)
Olá, futuros desenvolvedores de jogos! 👋 Sejam bem-vindos à nossa terceira aula do Módulo 2. Hoje, vamos aprender um conceito super importante para qualquer jogo: a detecção de colisão! 💥
1. Introdução: O que é Colisão em Jogos?
Você já jogou um jogo onde seu personagem coleta uma moeda, atira em um inimigo ou bate em uma parede? Em todos esses casos, algo muito importante está acontecendo nos bastidores: o jogo está detectando que dois objetos "se tocaram" ou "se encontraram". Isso é o que chamamos de colisão!
Em Pgzero, podemos verificar se dois Actors (ou um Actor e um ponto específico) estão se tocando. Isso nos permite fazer coisas como:
- Coletar itens 🍎
- Derrotar inimigos 👾
- Saber quando seu jogador bateu em um obstáculo 🧱
- Ativar eventos especiais 🎉
Vamos aprender duas formas simples e muito úteis de fazer isso: collidepoint() e colliderect().
2. Detecção de Colisão com collidepoint()
O que é collidepoint()?
A função collidepoint() (que significa "colidir com um ponto") é usada para verificar se um Actor (ou, mais precisamente, o retângulo que o define) está tocando um ponto específico na tela.
Pense assim: você tem uma maçã 🍎 (seu Actor) e quer saber se o mouse do jogador 🖱️ está em cima dela. O mouse é um ponto na tela (uma coordenada (x, y)). collidepoint() te diz se a maçã e esse ponto estão "se tocando".
Como funciona?
Você chama collidepoint() em um Actor e passa as coordenadas (x, y) do ponto que você quer verificar.
actor_objeto.collidepoint((x_do_ponto, y_do_ponto))Ela retorna:
True(Verdadeiro) se o ponto estiver dentro doActor.False(Falso) se o ponto não estiver dentro doActor.
Exemplo Simples com collidepoint()
Vamos criar um jogo onde você clica em um balão para fazê-lo estourar! 🎈
# game.py
import pgzrun
WIDTH = 800
HEIGHT = 600
balao = Actor("balao") # Certifique-se de ter uma imagem 'balao.png' na pasta 'images'
balao.pos = (WIDTH // 2, HEIGHT // 2)
def draw():
screen.fill((100, 100, 255)) # Fundo azul claro
balao.draw()
def on_mouse_down(pos):
# 'pos' é uma tupla (x, y) que representa a posição do clique do mouse
if balao.collidepoint(pos):
print("🎈 Estourou o balão!")
# Mova o balão para fora da tela ou mude sua imagem para "estourado"
balao.x = -100 # Move para fora da tela
# Ou, para mudar a imagem (se você tiver uma imagem 'balao_estourado.png'):
# balao.image = "balao_estourado"
pgzrun.go()Para este exemplo funcionar, você precisará de uma imagem chamada balao.png dentro de uma pasta images no mesmo diretório do seu arquivo game.py.
O que acontece aqui?
Quando você clica na tela (on_mouse_down), o Pgzero nos dá a posição pos onde o mouse foi clicado. Nós usamos balao.collidepoint(pos) para perguntar: "Onde o mouse foi clicado está dentro do meu balão?". Se a resposta for True, imprimimos uma mensagem e "estouramos" o balão movendo-o para fora da tela.
3. Detecção de Colisão com colliderect()
O que é colliderect()?
A função colliderect() (que significa "colidir com um retângulo") é usada para verificar se dois Actors (ou seus retângulos) estão se sobrepondo ou se tocando.
Imagine que você tem seu personagem 🚶♂️ e um inimigo 👾. Você quer saber se eles se chocaram. Ambos são Actors, e cada um tem um retângulo invisível ao redor deles. colliderect() verifica se esses dois retângulos estão se tocando.
Como funciona?
Você chama colliderect() em um Actor e passa outro Actor (ou o Rect dele) como argumento.
ator1.colliderect(ator2)Ela retorna:
True(Verdadeiro) se os retângulos dos doisActors estiverem se sobrepondo.False(Falso) se os retângulos não estiverem se tocando.
Exemplo Simples com colliderect()
Vamos fazer um jogo simples onde um jogador coleta uma moeda. 💰
# game.py
import pgzrun
WIDTH = 800
HEIGHT = 600
player = Actor("player") # Imagem 'player.png'
player.pos = (100, 300)
coin = Actor("coin") # Imagem 'coin.png'
coin.pos = (700, 300)
score = 0
def draw():
screen.fill((0, 0, 0)) # Fundo preto
player.draw()
coin.draw()
screen.draw.text(f"Moedas: {score}", (10, 10), color="white", fontsize=30)
def update():
global score
# Movimento do jogador com as setas do teclado
if keyboard.left:
player.x -= 3
if keyboard.right:
player.x += 3
if keyboard.up:
player.y -= 3
if keyboard.down:
player.y += 3
# Detecção de colisão entre o jogador e a moeda
if player.colliderect(coin):
print("💰 Moeda coletada!")
score += 1
# Move a moeda para uma nova posição aleatória
import random
coin.pos = (random.randint(50, WIDTH - 50), random.randint(50, HEIGHT - 50))
pgzrun.go()Para este exemplo funcionar, você precisará de imagens player.png e coin.png dentro de uma pasta images no mesmo diretório do seu arquivo game.py.
O que acontece aqui?
No loop update(), que é executado várias vezes por segundo, verificamos continuamente se player.colliderect(coin) é True. Se for, significa que o jogador tocou na moeda! Então, imprimimos uma mensagem, aumentamos a pontuação e movemos a moeda para um novo lugar aleatório para ser coletada novamente.
4. Resumo e Próximos Passos
Parabéns! 🎉 Você aprendeu os fundamentos da detecção de colisão em Pgzero:
collidepoint(): Verifica se um ponto (como um clique do mouse ou uma coordenada específica) está dentro de umActor.colliderect(): Verifica se os retângulos de doisActors estão se sobrepondo.
Essas duas funções são a base para muitas interações em jogos. Elas nos permitem criar um mundo onde objetos reagem uns aos outros, tornando o jogo muito mais dinâmico e divertido!
No próximo módulo, vamos explorar como fazer os Actors se moverem de formas mais interessantes e como reagir de maneiras diferentes às colisões.
5. Exercícios/Desafios Conceituais
Para fixar o que aprendemos, tente responder a estas perguntas:
- Em um jogo de "Space Invaders", onde você tem uma nave atirando em alienígenas, qual função de colisão você usaria para saber se:
- Um tiro atingiu um alienígena?
- O mouse do jogador está em cima de um botão de "Iniciar Jogo" na tela inicial?
- Qual a principal diferença entre
collidepoint()ecolliderect()em termos do que eles comparam? - Imagine que você está criando um jogo de labirinto. Como você usaria
colliderect()para saber se o jogador bateu em uma parede? (Dica: Pense nas paredes comoActors também!)
Pense nas respostas e prepare-se para a próxima aula, onde colocaremos esses conceitos em prática de maneiras ainda mais emocionantes! 🚀