Game Maker: Python com Pgzero para Crianças
PROJETO: Criando um Jogo Simples de 'Coleta'
Aprenda sobre projeto: criando um jogo simples de 'coleta'
Projeto - Criando um Jogo Simples de 'Coleta' com Pygame Zero 🎮
Olá, futuros desenvolvedores de jogos! 👋 Sejam bem-vindos ao nosso primeiro projeto completo em Pygame Zero! 🎉
Nesta aula, vamos colocar em prática tudo o que aprendemos até agora para construir um jogo simples e divertido de 'coleta'. Nosso objetivo é criar um jogo onde um personagem (o jogador) se move pela tela para coletar itens, ganhando pontos a cada coleta.
Este projeto é uma excelente maneira de consolidar seus conhecimentos sobre:
Actor: Como criar e manipular personagens e objetos.draw(): Como desenhar elementos na tela.update(): Como implementar a lógica do jogo, como movimento e detecção de colisão.- Entrada do Usuário: Como fazer o jogador controlar o personagem usando o teclado.
- Lógica de Jogo: Como gerenciar pontuação e estados dos objetos.
Vamos mergulhar de cabeça e criar nosso próprio jogo! 🚀
1. Introdução ao Projeto: O Jogo de Coleta 🍎
Imagine que você é um pequeno explorador em busca de frutas mágicas. Seu objetivo é coletar o máximo de frutas possível antes que o tempo acabe (ou apenas coletar sem parar, por enquanto!).
Nosso jogo terá:
- Um jogador controlável pelo teclado.
- Um item coletável (uma fruta, por exemplo) que aparece em posições aleatórias.
- Um contador de pontos que aumenta a cada item coletado.
- A lógica para o item desaparecer e reaparecer após ser coletado.
Pronto para começar? Pegue sua IDE (Ambiente de Desenvolvimento Integrado) e vamos codificar! 💻
2. Configuração Inicial do Jogo 🛠️
Todo jogo Pygame Zero começa com algumas configurações básicas. Vamos definir o tamanho da tela, o título e carregar as imagens que usaremos.
Importante: Para este projeto, você precisará de duas imagens simples:
player.png(para o jogador)collectible.png(para o item coletável)
Crie uma pasta chamada images no mesmo diretório do seu arquivo .py e coloque suas imagens lá. Você pode desenhar as suas próprias ou encontrar algumas bem simples na internet (certifique-se de que sejam pequenas, como 50x50 pixels).
# game.py
# 1. Configurações da Tela
WIDTH = 800 # Largura da tela em pixels
HEIGHT = 600 # Altura da tela em pixels
TITLE = "Coleta de Frutas Mágicas" # Título da janela do jogo
# Importar o módulo random para posicionamento aleatório
import random
# Definir a pontuação inicial
score = 0
# Cores (opcional, para texto ou fundo se não usar imagem)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)Explicação:
WIDTHeHEIGHT: Definem as dimensões da nossa janela de jogo.TITLE: O texto que aparecerá na barra de título da janela.import random: Precisaremos disso para fazer os itens coletáveis aparecerem em lugares aleatórios.score = 0: Inicializamos a pontuação do jogador.WHITE,BLACK,GREEN: São tuplas que representam cores no formato RGB. Úteis para desenhar texto ou preencher o fundo.
3. Criando o Jogador e o Item Coletável 🧑🚀🍎
Agora, vamos criar os nossos Actors para o jogador e o item. Lembre-se que um Actor precisa de um nome de imagem (que deve estar na pasta images).
# game.py (continue do código anterior)
# 2. Criando o Jogador
# O jogador será um Actor usando a imagem 'player.png'
# Ele começará no centro inferior da tela.
player = Actor("player")
player.pos = (WIDTH // 2, HEIGHT - 50) # Posição inicial: centro horizontal, perto da base
# 3. Criando o Item Coletável
# O item será um Actor usando a imagem 'collectible.png'
# Ele começará em uma posição aleatória.
collectible = Actor("collectible")
# A função place_collectible() será usada para posicionar o item aleatoriamente
def place_collectible():
collectible.x = random.randint(50, WIDTH - 50) # Posição X aleatória
collectible.y = random.randint(50, HEIGHT - 150) # Posição Y aleatória (evitando a parte inferior)
# Chame a função uma vez para posicionar o primeiro item
place_collectible()Explicação:
player = Actor("player"): Cria um objetoActorchamadoplayerusando a imagemplayer.png.player.pos = (WIDTH // 2, HEIGHT - 50): Define a posição inicial do jogador.WIDTH // 2o coloca no centro horizontal, eHEIGHT - 50o coloca a 50 pixels da borda inferior.collectible = Actor("collectible"): Cria umActorpara o item coletável.place_collectible(): Esta é uma função auxiliar que criamos para posicionar o item coletável em um local aleatório dentro dos limites da tela. Usamosrandom.randint()para gerar coordenadas X e Y.place_collectible(): Chamamos a função uma vez para garantir que o primeiro item já esteja na tela quando o jogo começar.
4. Desenhando na Tela (draw()) 🎨
A função draw() é onde tudo é desenhado na tela. Ela é chamada automaticamente várias vezes por segundo pelo Pygame Zero.
# game.py (continue do código anterior)
# 4. Função draw() - Desenhar todos os elementos na tela
def draw():
screen.fill(BLACK) # Preenche a tela com a cor preta (ou qualquer outra cor/imagem de fundo)
player.draw() # Desenha o jogador
collectible.draw() # Desenha o item coletável
# Desenha a pontuação na tela
screen.draw.text(f"Pontuação: {score}", (10, 10), color=WHITE, fontsize=30)Explicação:
screen.fill(BLACK): Limpa a tela a cada frame, preenchendo-a com preto. Se você tivesse uma imagem de fundo, usariascreen.blit('background_image', (0,0)).player.draw(): Desenha oActordo jogador em sua posição atual.collectible.draw(): Desenha oActordo item coletável.screen.draw.text(...): Esta é uma função muito útil para exibir texto.f"Pontuação: {score}": Usa uma f-string para formatar o texto com a pontuação atual.(10, 10): As coordenadas (x, y) onde o texto começará a ser desenhado (canto superior esquerdo).color=WHITE: Define a cor do texto.fontsize=30: Define o tamanho da fonte.
5. Lógica do Jogo (update()) e Movimento do Jogador 🏃♀️
A função update() é onde a lógica do jogo acontece. Ela também é chamada automaticamente várias vezes por segundo. Aqui vamos:
- Mover o jogador com base na entrada do teclado.
- Verificar se o jogador colidiu com o item coletável.
- Atualizar a pontuação e reposicionar o item se houver colisão.
# game.py (continue do código anterior)
# 5. Função update() - Lógica do jogo
PLAYER_SPEED = 5 # Velocidade do jogador
def update():
global score # Precisamos usar 'global' para modificar a variável score
# Movimento do Jogador
if keyboard.left:
player.x -= PLAYER_SPEED
if keyboard.right:
player.x += PLAYER_SPEED
if keyboard.up:
player.y -= PLAYER_SPEED
if keyboard.down:
player.y += PLAYER_SPEED
# Limitar o jogador dentro da tela
if player.left < 0:
player.left = 0
if player.right > WIDTH:
player.right = WIDTH
if player.top < 0:
player.top = 0
if player.bottom > HEIGHT:
player.bottom = HEIGHT
# Detecção de Colisão
if player.colliderect(collectible):
score += 1 # Aumenta a pontuação
place_collectible() # Reposiciona o item coletávelExplicação:
global score: Dentro de uma função, se você quiser modificar uma variável que foi definida fora dela (no escopo global), você precisa usar a palavra-chaveglobal. Se você apenas lê a variável, não precisa.- Movimento do Jogador: Pygame Zero facilita o acesso ao estado do teclado através do objeto
keyboard.keyboard.leftéTruese a seta para a esquerda estiver sendo pressionada.- Alteramos as coordenadas
xeydo jogador para movê-lo.
- Alteramos as coordenadas
- Limitar o Jogador: As propriedades
left,right,top,bottomde umActorsão muito úteis para verificar os limites.- Se o lado esquerdo do jogador for menor que 0 (saiu da tela pela esquerda), nós o ajustamos para 0. O mesmo para os outros lados.
- Detecção de Colisão:
player.colliderect(collectible): Este é um método super conveniente deActorque verifica se o retângulo doplayerestá se sobrepondo ao retângulo docollectible. RetornaTruese houver colisão,Falsecaso contrário.- Se houver colisão,
scoreé incrementado eplace_collectible()é chamado para mover o item para uma nova posição.
6. Código Completo do Projeto 🚀
Juntando todas as partes, aqui está o código completo para o nosso jogo de coleta!
# game.py
# --- 1. Configurações Iniciais ---
WIDTH = 800
HEIGHT = 600
TITLE = "Coleta de Frutas Mágicas"
import random
score = 0
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# --- 2. Criando o Jogador ---
player = Actor("player")
player.pos = (WIDTH // 2, HEIGHT - 50)
# --- 3. Criando o Item Coletável e Função de Posicionamento ---
collectible = Actor("collectible")
def place_collectible():
collectible.x = random.randint(50, WIDTH - 50)
collectible.y = random.randint(50, HEIGHT - 150) # Evita a parte inferior onde o player começa
# Garante que o coletável não apareça muito perto do jogador no início
if player.distance_to(collectible) < 100: # Se estiver muito perto, reposiciona
place_collectible()
# Posiciona o primeiro item ao iniciar o jogo
place_collectible()
# --- 4. Função draw() - Desenhar todos os elementos na tela ---
def draw():
screen.fill(BLACK) # Fundo preto
player.draw()
collectible.draw()
screen.draw.text(f"Pontuação: {score}", (10, 10), color=WHITE, fontsize=30)
# --- 5. Função update() - Lógica do jogo e Movimento ---
PLAYER_SPEED = 5
def update():
global score
# Movimento do Jogador
if keyboard.left:
player.x -= PLAYER_SPEED
if keyboard.right:
player.x += PLAYER_SPEED
if keyboard.up:
player.y -= PLAYER_SPEED
if keyboard.down:
player.y += PLAYER_SPEED
# Limitar o jogador dentro da tela
if player.left < 0:
player.left = 0
if player.right > WIDTH:
player.right = WIDTH
if player.top < 0:
player.top = 0
if player.bottom > HEIGHT:
player.bottom = HEIGHT
# Detecção de Colisão
if player.colliderect(collectible):
score += 1
place_collectible() # Reposiciona o itemPara rodar este jogo, salve o código como game.py (ou qualquer outro nome com .py) e certifique-se de ter as imagens player.png e collectible.png dentro de uma pasta images no mesmo diretório.
Abra seu terminal, navegue até o diretório onde salvou o arquivo e execute:
pgzrun game.pyDivirta-se jogando seu primeiro jogo de coleta! 🎉
7. Desafios e Próximos Passos (Exercícios) 💡
Parabéns por criar seu primeiro jogo completo! Mas a jornada de um desenvolvedor nunca para. Aqui estão alguns desafios e ideias para você expandir e melhorar seu jogo:
Lista de Tarefas do Projeto:
- Configuração inicial do jogo (tela, título, variáveis).
- Criação do
Actordo jogador. - Criação do
Actordo item coletável. - Função para posicionar o item coletável aleatoriamente.
- Desenho de todos os elementos na tela (
draw()). - Movimento do jogador usando o teclado (
update()). - Limitação do jogador dentro dos limites da tela.
- Detecção de colisão entre jogador e item.
- Aumento da pontuação e reposicionamento do item após a coleta.
- Exibição da pontuação na tela.
Desafios para Você:
- Adicionar um Temporizador:
- Crie uma variável
time_left(tempo restante), por exemplo, 30 segundos. - Em
update(), diminuatime_leftgradualmente (você pode usarclock.schedule_intervalpara isso, chamando uma função que diminui o tempo a cada segundo). - Exiba o tempo restante na tela.
- Quando
time_leftchegar a 0, pare o jogo e exiba "Game Over!".
- Crie uma variável
- Múltiplos Itens Coletáveis:
- Em vez de um único
Actorpara o item, crie uma lista deActors (ex:collectibles = []). - Adicione vários itens à lista no início do jogo.
- Modifique a lógica de colisão para verificar cada item na lista. Quando um item é coletado, remova-o da lista e adicione um novo, ou apenas reposicione-o.
- Em vez de um único
- Diferentes Tipos de Itens:
- Crie itens que valem mais pontos ou que dão bônus (ex: um item que aumenta a velocidade do jogador temporariamente).
- Isso exigirá diferentes imagens e talvez diferentes lógicas de colisão.
- Sons do Jogo:
- Adicione um som quando um item é coletado (
sounds.collect.play(), se você tiver um arquivocollect.oggoucollect.wavna pastasounds). - Adicione uma música de fundo.
- Adicione um som quando um item é coletado (
- Tela de Início e Fim:
- Crie diferentes "estados" para o jogo (ex:
GAME_STATE = "MENU",GAME_STATE = "PLAYING",GAME_STATE = "GAME_OVER"). - Modifique
draw()eupdate()para exibir diferentes coisas e ter diferentes lógicas dependendo doGAME_STATE. Por exemplo, uma tela de menu com um botão "Iniciar" e uma tela de "Game Over" com a pontuação final.
- Crie diferentes "estados" para o jogo (ex:
- Obstáculos:
- Adicione
Actors que o jogador deve evitar. Se colidir, perde pontos ou o jogo acaba.
- Adicione
8. Resumo e Próximos Passos 🌟
Parabéns! Você acaba de construir seu primeiro jogo completo de coleta com Pygame Zero! 🥳
Nesta aula, você:
- Reviu e aplicou conceitos essenciais como
Actor,draw(),update(). - Implementou controle do jogador via teclado.
- Gerenciou a lógica de colisão e pontuação.
- Usou o módulo
randompara posicionar elementos dinamicamente. - Exibiu texto na tela para feedback ao jogador.
Este projeto é a base para muitos outros jogos que você pode imaginar. A habilidade de quebrar um problema grande (criar um jogo) em partes menores e gerenciáveis é crucial na programação.
Continue experimentando com os desafios propostos. A melhor maneira de aprender é fazendo e modificando o código existente.
No próximo módulo, vamos explorar conceitos mais avançados e talvez até começar a pensar em como estruturar jogos maiores.
Até a próxima aula e divirta-se programando! ✨