Implementando Movimentação - Controlando a Nave
No capítulo anterior, nossa nave apareceu no centro da tela. Mas ela está congelada. Vamos ensiná-la a obedecer aos comandos do teclado.
Neste capítulo, vamos começar a dar vida a nave.
Ao longo deste capítulo você aprenderá a:
- Mover a nave pela tela
- Capturar entradas do usuário
- Limitar sua posição para não sair fora da tela
Vamos começar vendo como podemos mover a nave pela tela.
Movendo a Nave pela Tela
Para a nave se mover, sua posição precisa mudar a cada frame.
Por exemplo: para mover a nave para a direita, incrementamos o valor de x em todo frame.
Então dentro do game loop podemos fazer:
nave['x'] += 1
Isso faz com que a nave se mova um pixel para direita a cada frame.
Lembra do
clock.tick(60)que configuramos no primeiro capítulo?É ele que garante que o jogo rode 60 quadros por segundo.
Como o jogo está limitado a 60 FPS, isso significa: 60 pixels por segundo de movimento.
Ao executar o jogo você verá a nave se mover para direita.
Movemos a nave, mas ainda não a controlamos com o teclado. Vamos ver como podemos detectar as teclas pressionadas e fazer com que ela seja controlada.
Capturando Entradas do Usuário
Para detectar quais teclas foram pressionadas usamos a função pygame.key.get_pressed().
Ela retorna uma lista contendo o estado de todas as teclas do teclado. Para verificar uma tecla específica usamos constantes do Pygame, como pygame.K_RETURN, pygame.K_w ou pygame.K_SPACE.
Por exemplo:
teclas = pygame.key.get_pressed() if teclas[pygame.K_RETURN]: print("Tecla ENTER foi pressionada!")
Obtemos a lista de teclas e verificamos se teclas[pygame.K_RETURN] é verdadeiro.
Se a tecla ENTER for pressionada, o console exibe: "Tecla ENTER foi pressionada!".
Controlando a Nave
Vamos expandir a estrutura da nave criada no capítulo anterior, adicionando uma chave para armazenar sua velocidade.
nave = { "imagem": nave_img, "x": janela.get_width() // 2 - nave_img.get_width() // 2, "y": janela.get_height() // 2 - nave_img.get_height() // 2, "velocidade": 5 }
Vamos controlar a nave usando as teclas W, A, S e D.
# Move a nave para cima if teclas[pygame.K_w]: nave['y'] -= nave['velocidade'] # Move a nave para baixo if teclas[pygame.K_s]: nave['y'] += nave['velocidade'] # Move a nave para esquerda if teclas[pygame.K_a]: nave['x'] -= nave['velocidade'] # Move a nave para direita if teclas[pygame.K_d]: nave['x'] += nave['velocidade']
Lembra do sistema de coordenadas do Pygame?
Ele será usado para saber qual direção estamos movendo a nave. Aumentando ou diminuindo os valores das posições
xey.
Resumindo o que cada tecla faz:
- Se a tecla
Wfor pressionada, subtraímos o valor deypela velocidade. Fazendo a nave mover para cima. - Se a tecla
Sfor pressionada, somamos o valor deypela velocidade. Fazendo a nave move para baixo. - Se a tecla
Afor pressionada, subtraímos o valor dexpela velocidade. Fazendo a nave mover para esquerda. - Se a tecla
Dfor pressionada, somamos o valor dexpela velocidade. Fazendo a nave move para direita.
Ao executar o jogo, você conseguirá controlar a nave usando as teclas configuradas.
Ainda não limitamos o movimento da nave. Por isso, ela pode sair da tela enquanto você a controla.
Vamos ver como impedir que isso aconteça.
Limitando a Posição da Nave
Para limitar a movimentação, primeiro precisamos saber: quais pontos da nave estão ultrapassando os limites da janela?
A imagem acima ilustra como identificamos cada ponto da nave. Lembre-se que o seu ponto de origem é o canto superior esquerdo.
Podemos limitar a posição da nave da seguinte forma:
# Limita a posição x if nave["x"] <= 0: nave["x"] = 0 elif nave["x"] + nave["imagem"].get_width() >= janela.get_width(): nave["x"] = janela.get_width() - nave["imagem"].get_width() # Limita a posição y if nave["y"] <= 0: nave["y"] = 0 elif nave["y"] + nave["imagem"].get_height() >= janela.get_height(): nave["y"] = janela.get_height() - nave["imagem"].get_height()
Primeiro verificamos se o ponto da nave está fora da janela. O ponto que sair da tela é puxado de volta. Assim a nave permanece dentro da janela.
O que Aprendemos até Agora?
Aqui você aprendeu a controlar a nave e manter ela dentro da janela.
Neste capítulo você:
- Movimentou a nave
- Capturou entradas do usuário
- Manteve a nave na tela
Código Completo
import pygame pygame.init() janela = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() nave_img = pygame.image.load("img/nave.png") nave = { "imagem": nave_img, "x": janela.get_width() // 2 - nave_img.get_width() // 2, "y": janela.get_height() // 2 - nave_img.get_height() // 2, "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_w]: nave["y"] -= nave["velocidade"] if teclas[pygame.K_s]: nave["y"] += nave["velocidade"] if teclas[pygame.K_a]: nave["x"] -= nave["velocidade"] if teclas[pygame.K_d]: nave["x"] += nave["velocidade"] if nave["x"] <= 0: nave["x"] = 0 elif nave["x"] + nave["imagem"].get_width() >= janela.get_width(): nave["x"] = janela.get_width() - nave["imagem"].get_width() if nave["y"] <= 0: nave["y"] = 0 elif nave["y"] + nave["imagem"].get_height() >= janela.get_height(): nave["y"] = janela.get_height() - nave["imagem"].get_height() janela.fill("black") janela.blit(nave["imagem"], (nave["x"], nave["y"])) pygame.display.flip() clock.tick(60) pygame.quit()
Próximo Passo: Adicionando Obstáculos
Agora que temos uma nave sob seu total controle. No próximo capítulo vamos criar os obstáculos: meteoros que caem na tela.
