Implementando Movimentação - Controlando a Nave

30/04/2026
iniciante pygame python 2d guia série

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:

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 x e y.

Resumindo o que cada tecla faz:

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?

Pontos da nave

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ê:

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.