Construindo a Base do Jogo - Janela e Game Loop
⚠️Antes de começarmos:
- [ ] Python Instalado (check!)
- [ ] Editor de código pronto (check!)
Se você ainda não instalou o Python, clique aqui para configurar rapidamente. Depois, volte para continuarmos.
Nesta série, você aprenderá a criar um jogo estilo space shooter em Python com Pygame.
Tudo do zero. Passo a passo. Mesmo sendo iniciante.
Ao final da série, você terá:
- Uma nave controlável
- Sistema de Tiros
- Inimigos
- Colisões
- Sistema de pontuação
Para darmos início, vamos instalar o Pygame, criar a janela do jogo e implementar o primeiro game loop.
Instalando o Pygame
Durante a criação do nosso jogo vamos utilizar o Pygame, uma biblioteca do Python voltada para desenvolvimento de jogos.
Para instalá-la execute o seguinte comando em um terminal:
$ pip install pygame
Caso você esteja utilizando o VS Code, pressione
Ctrl + Jpara abrir o terminal integrado.
Se a instalação for concluída com sucesso, ao executar o comando python -m pygame, você deverá ver a versão da biblioteca instalada.
$ python -m pygame pygame 2.6.1 (SDL 2.28.4, Python 3.12.3) Hello from the pygame community. <https://www.pygame.org/contribute.html>
Com o Pygame devidamente instalado podemos começar a criar o nosso jogo.
Crie uma pasta para o projeto e, dentro dela, um arquivo chamado main.py. Em seguida, abra a pasta no seu editor de código.
Antes de começar a criar os elementos do jogo, precisamos criar o ambiente onde tudo vai acontecer: a janela principal.
Criando a Janela com Pygame
Vamos começar criando essa janela.
# Importa o Pygame import pygame # Prepara os componentes internos do Pygame pygame.init() # Cria a janela do jogo janela = pygame.display.set_mode((800, 600))
Primeiro importamos a biblioteca Pygame.
Ela possui vários módulos, que são partes especializadas da biblioteca responsáveis por áudio, imagens, teclado, mouse e outras funcionalidades.
A função pygame.init() prepara esses módulos. Depois disso, podemos começar a usá-los no jogo.
Quase todos os programas feitos com Pygame começam com
pygame.init().
Em seguida, criamos uma janela com:
pygame.display.set_mode((800, 600))
Onde:
- 800 = largura
- 600 = altura
Executando o jogo, a janela deve abrir e fechar rapidamente. Isso acontece porque o programa cria a janela e termina logo em seguida.
Para resolver este problema precisamos manter o jogo em execução usando o game loop.
Mantendo o Jogo em Execução
O game loop é simplesmente um ciclo que se repete continuamente enquanto o jogo estiver aberto.
Pense nele como o motor de um carro ligado. Enquanto o motor está funcionando, todas as outras partes podem operar.
O que o Game Loop faz?
Ele executa continuamente várias tarefas:
- Processa eventos (teclado, mouse e fechamento de janela)
- Atualiza os objetos do jogo
- Desenha elementos na tela
- Controla o FPS (quadros por segundo)
Nos próximos capítulos, quase todo elemento visual será desenhado repetidamente dentro do game loop. Por isso, entender esse ciclo agora é tão importante.
Criando um Game Loop
Podemos criar um game loop da seguinte maneira:
rodando = True # Diz se o jogo está em execução # Game loop while rodando: # Captura eventos (ações do usuário, como pressionar teclas ou fechar a janela) for evento in pygame.event.get(): # Verifica se a janela foi fechada if evento.type == pygame.QUIT: rodando = False # Preenche a janela com a cor preta janela.fill('black') # Atualiza toda a janela pygame.display.flip() # Finaliza o Pygame corretamente pygame.quit()
O while rodando cria um ciclo contínuo. Ele faz o jogo repetir suas ações várias vezes por segundo.
Dentro do game loop, criamos um loop for que itera os eventos com pygame.event.get() e verificamos se o evento de fechamento de janela foi executado.
Um evento é qualquer ação detectada pelo jogo, como pressionar uma tecla ou fechar a janela.
Quando a janela é fechada, rodando muda para False. Isso encerra o game loop e finaliza o jogo.
A função fill() preenche toda a janela com uma única cor. Aqui usamos ela para limpar toda a tela antes de desenharmos os elementos.
Imagine que o Pygame desenha tudo em uma folha de rascunho invisível. Quando usamos pygame.display.flip(), essa folha é exibida na tela de uma só vez.
Em jogos, o desenho não aparece na tela no instante em que é criado. Ele precisa ser "publicado" no fim do ciclo.
Agora ao executar o jogo, a janela permanecerá aberta. Ela só será fechada quando o evento pygame.QUIT acontecer.
No final, assim como usamos o pygame.init() para preparar o Pygame, usamos pygame.quit() para encerrar seus componentes corretamente quando o jogo termina.
Na prática, isso ocorre quando você clica no botão de fechar.
O Jogo já abre. Agora falta controlar o ritmo.
Até este ponto o jogo já funciona, mas existe um problema. Precisamos limitar o FPS (quadros por segundo) para evitar que o jogo rode rápido demais.
Para controlar o FPS, o Pygame fornece uma ferramenta chamada Clock. Essa ferramenta é criada da seguinte maneira:
clock = pygame.time.Clock()
Essa ferramenta controla a velocidade do loop. Dentro do game loop, chamamos clock.tick(60) para limitar o jogo a 60 FPS (60 quadros por segundo).
while rodando: ... # Limita a velocidade para 60 FPS (60 quadros por segundo) clock.tick(60)
Aqui a função clock.tick(60) é responsável por adicionar um limite de 60 FPS no game loop.
Com isso, o jogo roda em velocidade controlada. O comportamento fica previsível em qualquer máquina.
O
Clocknão desenha nada e não move nada. Ele só ajuda o jogo a manter uma cadência estável.
O que Aprendemos até Agora?
Até o momento você já possui uma estrutura fundamental do o jogo funcionando. A janela abre corretamente, permanece ativa e atualiza dezenas de vezes por segundo.
Neste capítulo você:
- Instalou o Pygame
- Criou a janela do jogo
- Entendeu por que ela fecha imediatamente
- Implementou o seu primeiro game loop
- Limitou a taxa de quadros para 60 FPS
Nos próximos capítulos, tudo o que construirmos será adicionado sobre essa mesma base.
Código Completo
import pygame pygame.init() janela = pygame.display.set_mode((800, 600)) clock = pygame.time.Clock() running = True while rodando: for evento in pygame.event.get(): if evento.type == pygame.QUIT: rodando = False janela.fill('black') pygame.display.flip() clock.tick(60) pygame.quit()
Próximo Passo: Adicionando o Primeiro Objeto Visual
No próximo capítulo, vamos finalmente desenhar a nave do jogador e preparar a base para movimentá-la na tela.