Game Maker: Python com Pgzero para Crianças
Recebendo Comandos do Teclado
Aprenda sobre recebendo comandos do teclado
⌨️ Recebendo Comandos do Teclado
Olá, futuro Game Maker! 👋
No módulo anterior, aprendemos a dar vida aos nossos atores na tela, mas eles ainda estão um pouco parados, não é? Para que nossos jogos sejam divertidos e interativos, precisamos que os jogadores possam controlar os atores! E a forma mais comum de fazer isso em jogos de computador é usando o teclado.
Nesta aula prática, vamos aprender como fazer nossos atores reagirem aos comandos que você digita no teclado. Prepare-se para dar o controle aos seus jogadores! 🎮
🚀 1. Introdução: Dando Vida aos Controles
Imagine um jogo de nave espacial. Você precisa mover a nave para a esquerda e para a direita, talvez atirar. Ou em um jogo de plataforma, seu personagem precisa pular e andar. Tudo isso começa com o teclado!
Com o Pgzero, é super fácil detectar quando uma tecla é pressionada. Vamos explorar duas maneiras principais de fazer isso:
- Verificando o estado do teclado no
update(): Ideal para movimentos contínuos (como andar enquanto a tecla está pressionada). - Usando funções de evento (
on_key_down,on_key_up): Ideal para ações que acontecem uma única vez quando a tecla é pressionada ou solta (como pular ou atirar).
Vamos começar a codificar! 🧑💻
🧐 2. Entendendo o Teclado no Pgzero
O Pgzero nos dá um objeto especial chamado keyboard. Ele nos permite saber quais teclas estão sendo pressionadas a cada momento. Além disso, podemos usar funções especiais para reagir a eventos de teclado.
2.1. 🕹️ Movimento Contínuo com keyboard no update()
A função update() é chamada várias vezes por segundo. Isso a torna perfeita para verificar se uma tecla está sendo mantida pressionada e, se sim, mover nosso ator continuamente.
O objeto keyboard possui "propriedades" para cada tecla. Por exemplo, keyboard.left é True se a tecla seta para a esquerda estiver pressionada, e False caso contrário.
Exemplo:
Vamos fazer um ator se mover para a esquerda e para a direita usando as setas.
# Largura e altura da janela do jogo
WIDTH = 800
HEIGHT = 600
# Nosso ator
nave = Actor('nave') # Certifique-se de ter uma imagem 'nave.png' na pasta 'images'
nave.pos = (WIDTH / 2, HEIGHT / 2) # Posição inicial no centro
# Velocidade da nave
VELOCIDADE = 3
def draw():
screen.clear() # Limpa a tela a cada frame
nave.draw() # Desenha a nave
def update():
# Verifica se a tecla seta para a esquerda está pressionada
if keyboard.left:
nave.x -= VELOCIDADE # Move a nave para a esquerda
# Verifica se a tecla seta para a direita está pressionada
if keyboard.right:
nave.x += VELOCIDADE # Move a nave para a direita
# Opcional: Limitar a nave dentro da tela
if nave.left < 0:
nave.left = 0
if nave.right > WIDTH:
nave.right = WIDTH
O que está acontecendo aqui? 🤔
- Na função
update(), estamos constantemente perguntando: "A teclaleftestá pressionada?" e "A teclarightestá pressionada?". - Se a resposta for sim (
True), ajustamos a posiçãoxda nossanave. - Isso cria um movimento suave e contínuo enquanto a tecla estiver pressionada.
2.2. 💥 Ações Pontuais com on_key_down() e on_key_up()
Às vezes, queremos que algo aconteça apenas uma vez quando uma tecla é pressionada, e não continuamente. Por exemplo, um pulo ou um tiro. Para isso, usamos funções de evento:
on_key_down(key): Esta função é chamada uma vez quando uma tecla é pressionada.on_key_up(key): Esta função é chamada uma vez quando uma tecla é solta.
A variável key que é passada para essas funções nos diz qual tecla foi pressionada ou solta. Para comparar, usamos constantes do Pgzero, como keys.SPACE, keys.UP, keys.A, etc.
Exemplo:
Vamos fazer a nave mudar de cor quando a tecla SPACE (espaço) for pressionada e voltar ao normal quando ela for solta.
# Largura e altura da janela do jogo
WIDTH = 800
HEIGHT = 600
# Nosso ator
nave = Actor('nave') # Certifique-se de ter uma imagem 'nave.png' na pasta 'images'
nave.pos = (WIDTH / 2, HEIGHT / 3) # Posição inicial
# Cor original da nave (para o exemplo de mudança de cor)
COR_ORIGINAL = 'nave'
COR_ATIVADA = 'nave_fogo' # Certifique-se de ter uma imagem 'nave_fogo.png'
def draw():
screen.clear()
nave.draw()
# Não precisamos de update() para este exemplo específico, mas podemos combiná-lo com o anterior!
# Função chamada quando uma tecla é pressionada
def on_key_down(key):
if key == keys.SPACE: # Se a tecla ESPAÇO foi pressionada
print("Espaço pressionado! Ativando modo fogo! 🔥")
nave.image = COR_ATIVADA # Muda a imagem da nave
# Função chamada quando uma tecla é solta
def on_key_up(key):
if key == keys.SPACE: # Se a tecla ESPAÇO foi solta
print("Espaço solto! Desativando modo fogo. 🌬️")
nave.image = COR_ORIGINAL # Volta a imagem original da nave
O que está acontecendo aqui? 🤔
- Quando a tecla
SPACEé pressionada,on_key_downé ativada. Dentro dela, verificamos se a tecla ékeys.SPACEe, se for, mudamos a imagem da nave. - Quando a tecla
SPACEé solta,on_key_upé ativada. Fazemos a mesma verificação e mudamos a imagem de volta. - Isso é ótimo para ações como "atirar" (pressionou uma vez, atirou), "pular" (pressionou uma vez, personagem pula), etc.
🎯 3. Exercícios Práticos: Mãos na Massa!
Agora é a sua vez de combinar o que aprendeu! Vamos criar um pequeno jogo onde você controla uma nave e ela pode "atirar".
🚀 Desafio 1: Nave Espacial Completa!
Vamos criar um jogo simples onde você controla uma nave espacial que pode se mover em todas as direções e atirar.
Objetivo:
Fazer uma nave se mover para cima, baixo, esquerda, direita e "atirar" (imprimir uma mensagem no console) quando a tecla SPACE for pressionada.
Passos:
- Crie um novo arquivo Python para o seu jogo (ex:
nave_game.py). - Defina
WIDTHeHEIGHTpara a janela do jogo. - Crie um ator
nave(use uma imagem como 'nave.png', você pode encontrar ou desenhar uma). - Defina uma velocidade para a nave (ex:
VELOCIDADE = 5). - Implemente a função
draw()para limpar a tela e desenhar a nave. - Implemente a função
update():- Use
if keyboard.left:para mover a nave para a esquerda. - Use
if keyboard.right:para mover a nave para a direita. - Use
if keyboard.up:para mover a nave para cima. - Use
if keyboard.down:para mover a nave para baixo. - Bônus: Adicione limites para que a nave não saia da tela.
- Use
- Implemente a função
on_key_down(key):- Se a tecla
keys.SPACEfor pressionada, imprima a mensagem "Pew! Pew! 💥" no console.
- Se a tecla
Dica: Como adicionar limites na função update()
# Limites para a nave
if nave.left < 0:
nave.left = 0
if nave.right > WIDTH:
nave.right = WIDTH
if nave.top < 0:
nave.top = 0
if nave.bottom > HEIGHT:
nave.bottom = HEIGHT🤸 Desafio 2: Personagem Saltitante
Agora, vamos fazer um personagem que pode andar para os lados e pular!
Objetivo:
Fazer um personagem se mover para a esquerda e direita com as setas e pular quando a tecla SPACE for pressionada.
Passos:
- Use o código do Desafio 1 como base, ou crie um novo arquivo.
- Mude o ator para um
personagem(ex: 'personagem.png'). Posicione-o na parte inferior da tela. - Mantenha o movimento para a esquerda (
keyboard.left) e direita (keyboard.right) na funçãoupdate(). - Na função
on_key_down(key):- Se a tecla
keys.SPACEfor pressionada, faça o personagem "pular". - Para um pulo simples: diminua o
ydo personagem (ex:personagem.y -= 50). - Bônus: Para um pulo mais realista, você pode usar
animate()para mover o personagem para cima e depois para baixo.
- Se a tecla
Dica: Como fazer um pulo simples com animate()
# No início do seu código, após definir o personagem
personagem = Actor('personagem')
personagem.pos = (WIDTH / 2, HEIGHT - 50) # Posição inicial no chão
# ...
def on_key_down(key):
global personagem # Se 'personagem' for uma variável global
if key == keys.SPACE:
# Anima o personagem para subir e depois descer
animate(personagem, duration=0.2, y=personagem.y - 80).then(
animate(personagem, duration=0.2, y=HEIGHT - 50) # Volta para o chão
)📝 4. Resumo e Próximos Passos
Parabéns! 🎉 Você deu um grande passo para tornar seus jogos interativos!
Nesta aula, aprendemos:
- Como usar o objeto
keyboarddentro da funçãoupdate()para detectar teclas pressionadas continuamente, ideal para movimento. - Como usar as funções de evento
on_key_down()eon_key_up()para reagir a um único pressionamento ou soltura de tecla, ideal para ações pontuais como pular ou atirar. - Como usar
keys.NOME_DA_TECLApara identificar qual tecla foi pressionada.
Agora seus atores não são mais bonecos parados, mas sim personagens que podem ser controlados pelo jogador!
No próximo módulo, vamos explorar como fazer nossos atores interagirem uns com os outros, como detectar colisões entre eles e dar ainda mais vida aos nossos jogos. Prepare-se para a diversão! 💥