Tutorial ministrado por João Paulo Carvalho na Python Brasil 2020. Estou no GitHub, Instagram e Telegram como @jjpaulo2. Acesse aqui o slide utilizado no tutorial.
- primeiro_jogo.py
- exemplo_loop_principal.py
- exemplo_clock.py
- exemplo_eventos_teclado.py
- exemplo_retangulo.py
- exemplo_colisao.py
- exemplo_superficie_imagem.py
- exemplo_retangulo.py
- exemplo_musica.py
- exemplo_sprites.py
- Feito em Python.
- Simples de aprender.
- Gratuito, distribuido sob a LGPL.
- Processamento Multi-Core nativo.
- Compatível com qualquer sistema operacional.
- Construa seus jogos da forma que quiser.
Em pygame.org você pode encontrar um catálogo gigantesco com projetos da comunidade.
Python DOOM | Barbie Seahorse Adventures |
A documentação oficial da biblioteca está disponível em pygame.org/docs.
Assumindo que você já preparou um ambiente virtual do Python, apenas execute o seguinte comando.
$ pip install pygame
Ou se preferir usar o Pipenv.
$ pipenv install pygame
Você pode testar alguns exemplos embutidos na própria biblioteca através do módulo pygame.examples
.
$ python -m pygame.examples.aliens
$ python -m pygame.examples.chimp
Assumindo que você está dentro do ambiente virtual do Python utilizado previamente, apenas execute o seguinte comando.
$ pip install pyopengl numpy
Ou se preferir usar o Pipenv.
$ pipenv install pyopengl numpy
O módulo de exemplos também possui alguns exemplos em 3D.
$ python -m pygame.examples.glcube
O código a seguir é funcional. Não se preocupe. Em breve você entenderá o que significa cada coisa nesse código.
# IMPORTANDO A BIBLIOTECA
import pygame
# INICIALIZANDO O PYGAME
pygame.init()
# CRIANDO NOSSA JANELA
tela = pygame.display.set_mode([600, 800])
# DEFININDO O RELÓGIO QUE VAI CONTAR OS FRAMES POR SEGUNDO
clock = pygame.time.Clock()
# CRIANDO UM QUADRADO QUE SERÁ EXIBIDO NA TELA
quadrado = pygame.Rect(100, 100, 50, 50)
# LOOP PRINCIPAL DO JOGO
executando = True
while executando:
# VERIFICANDO EVENTOS
for evento in pygame.event.get():
# EVENTO DE FECHAR A TELA
if evento.type == pygame.QUIT:
executando = False
# EVENTOS DE TECLA PRESSIONADA
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_DOWN:
quadrado.move_ip([0, 20])
if evento.key == pygame.K_UP:
quadrado.move_ip([0, -20])
if evento.key == pygame.K_LEFT:
quadrado.move_ip([-20, 0])
if evento.key == pygame.K_RIGHT:
quadrado.move_ip([20, 0])
# ELEMENTOS DA TELA
pygame.draw.rect(tela, (255, 0, 0), quadrado)
# CONFIGURAÇÃO DE QUADROS
clock.tick(27)
pygame.display.update()
pygame.quit()
O resultado desse código é como na imagem a seguir. Um quadrado que se move na tela e deixa seu rastro.
Janelas [ver documentação]
Onde todo o conteúdo que você vai criar será exibido.
# DEFININDO DIMENSÃO DA TELA
# É IMPORTANTE GUARDAR A INSTÂNCIA DA TELA PARA PODER FAZER MANIPULAÇÕES
tela = pygame.display.set_mode([300, 300])
# DEFININDO O TÍTULO DA JANELA
pygame.display.set_caption("Título da minha janela")
O loop que acontece durante a execução do jogo. É onde toda a lógica irá ser moldada.
# DEFININDO UMA FLAG PRA VERIFICAR A EXECUÇÃO
executando = True
while executando:
# OBTENDO OS EVENTOS E ITERANDO SOBRE ELES
for evento in pygame.event.get():
# VERIFICANDO SE HOUVE SOLICITAÇÃO PRA FECHAR A JANELA
if evento.type == pygame.QUIT:
executando = False
# INDICANDO O FIM DO SCRIPT DO PYGAME
pygame.quit()
Quadros / Clock [ver documentação]
O relógio que marca e define a quantidade de loops que acontecerão em 1 segundo.
# CRIANDO O OBJETO CLOCK
clock = pygame.time.Clock()
...
while executando:
...
# MANDA O RELÓGIO RODAR PARA SER CAPAZ DE
# EXIBIR 30 QUADROS POR SEGUNDO
clock.tick(30)
# MÉTODO QUE ATUALIZA A TELA
pygame.display.update()
Cores [ver documentação]
Cores no PyGame são representadas por tuplas do tipo
(red: int, green: int, blue: int)
.
VERMELHO = (255, 0, 0)
AZUL = (0, 0, 255)
VERDE = (0, 255, 0)
BRANCO = (255, 255, 255)
PRETO = (0, 0, 0)
CINZA = (150, 150, 150)
Eventos [ver documentação]
Ações que podem ser tratadas durante o loop principal do seu jogo. Elas podem ser de vários tipos e possuem parâmetros que podem ser lidos para tratá-los.
while executando:
...
# EVENTO DE SAIR DO JOGO
if evento.type == pygame.QUIT:
...
# EVENTOS DE TECLA PRESSIONADA
if evento.type == pygame.KEYDOWN:
if evento.key == pygame.K_DOWN:
...
Veja a tabela a seguir com os principais tipos de eventos e seus paramêtros.
Tipo de evento | Parâmetros |
---|---|
QUIT | none |
ACTIVEEVENT | gain, state |
KEYDOWN | key, mod, unicode, scancode |
KEYUP | key, mod |
MOUSEMOTION | pos, rel, buttons |
MOUSEBUTTONUP | pos, button |
MOUSEBUTTONDOWN | pos, button |
VIDEORESIZE | size, w, h |
USEREVENT | code |
Retângulos [ver documentação]
Retângulos no PyGame são declarados por objetos da forma pygame.Rect(left: float, top: float, width: float, height: float)
.
# DECLARANDO RETÂNGULO
retangulo = pygame.Rect(10, 10, 30, 30)
...
while executando:
...
# MÉTODO QUE DESENHA O RETÂNGULO NA TELA
pygame.draw.rect(tela, cor, retangulo)
Colisões [ver documentação]
A classe Rect possui métodos capazes de verificar colisões.
# VERIFICA SE O RETÂNGULO CONTÉM O OUTRO PASSADO COMO PARÂMETRO
pygame.Rect.contains(Rect) -> bool
# VERIFICA SE O RETÂNGULO CONTÉM O PONTO PASSADO COMO PARÂMETRO
pygame.Rect.collidepoint(x, y) -> bool
# VERIFICA SE O RETÂNGULO SE COLIDIU COM O OUTRO
pygame.Rect.colliderect(Rect) -> bool
# VERIFICA SE ALGUM RETÂNGULO DA LISTA COLIDIU COM O OBJETO
pygame.Rect.collidelist(list[Rect]) -> bool
# VERIFICA SE TODOS OS RETÂNGULO DA LISTA COLIDIRAM COM O OBJETO
pygame.Rect.collidelistall(list[Rect]) -> bool
Construa um jogo com dois retângulos na tela. Você deverá controlar um deles e assim que ele colidir com o segundo, este deverá mudar sua posição na tela.
Superfícies [ver documentação]
Elas nos permitem ir além de apenas retângulos coloridos e nos dá o poder de começar a manipular imagens. Superficies são criadas através de pygame.Surface((width, height))
.
# CRIANDO A SUPERFÍCIE DE DIMENSÕES (largura, altura)
superficie = pygame.Surface((200, 200))
...
while executando:
...
# MÉTODO QUE DESENHA A SUPERFÍCIE NA TELA
# NA POSIÇÃO (x, y)
tela.blit(superficie, (0, 0))
Para usar imagens, basta usar o seguinte método.
# A VARIÁVEL “imagem” É UM OBJETO DA CLASSE pygame.Surface
imagem = pygame.image.load(r“C:/minha_imagem.png”)
# MÉTODO QUE RETORNA O RETÂNGULO DA SUPERFÍCIE
imagem_rect = imagem.get_rect()
Construa um jogo com uma imagem de cenário e uma imagem de personagem que consegue se mover.
Música [ver documentação]
Podemos tocar músicas no nosso jogo com a ajuda do pacote pygame.mixer
.
# INICIALIZE O MIXER ANTES DE INICIALIZAR O PYGAME
# OS PARÂMETROS SÃO (frequencia, tamanho, canal, buffer)
pygame.mixer.pre_init(44100, 16, 2, 1024)
pygame.init()
...
while executando:
...
# CARREGANDO E TOCANDO A MÚSICA
pygame.mixer.music.load(r”C:\minha_musica.wav”)
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play()
Construa um jogo com dois retângulos na tela. Cada um deve tocar uma música específica ao ser clicado.
Sprites [ver documentação]
São sequências de imagens que geram uma animação. Iremos implementa-los como classes filhas de pygame.sprite.Sprite
.
class MeuSprite(pygame.sprite.Sprite):
def __init__(self, x, y):
...
self.x = x
self.y = y
self.images = [...]
self.index = ...
self.image = ...
self.rect = ...
def update(self):
...
Adicione um pouco de movimento ao desafio 2. Implemente uma classe de sprites e dê vida ao seu personagem.
O site spriters-resource.com é uma das melhores opções para obter folhas de sprites.
Primeiros resultados da busca por sprites de Super Nintendo na letra M.
Folha de sprites de sprites do Super Mario Bros 3 obtida no spriters-resource.com.
Qual o próximo passo? Agora é você quem define isso. Você já obteu conhecimento suficiente para ser capaz de sanar suas dúvidas através da documentação oficial, fóruns, grupos, e talvez comigo (estou sempre disponível e disposto a ajudar).
O que é necessário para desenvolver jogos em 3D com a biblioteca? Além de ter domínio do fundamental do PyGame, você deve estudar alguma API gráfica, como DirectX ou OpenGL. Python possui a biblioteca DirectPython capaz de renderizar gráficos com DirectX e PyOpenGL para OpenGL.
É possível desenvolver grandes jogos com PyGame e publicar em uma loja como a Steam? Sim, é possível. Você pode usar uma biblioteca como PyInstaller para empacotar o seu módulo Python e distribuir o jogo da forma como quiser. É claro que quando se fala de "grandes jogos" usar PyGame pode não ser a escolha mais produtiva. Muito provavelmente será mais conveniente migrar para uma engine mais robusta como Unreal, Unity ou a nova favorita do mundo open-source Godot que possui uma linguagem de script muito semelhante á Python.