Pygame


Biblioteca Python útil para criação de jogos que auxilia em diversos pontos importantes, como:

  • Desenho de formas gráficas (círculos, retângulos, etc.)
  • Exibição de imagens
  • Animação
  • Interação com teclado, mouse e gamepad
  • Reproduzir sons
  • Detectar quando objetos colidem


Instalação

Rodar no terminal: pip install pygame

Caso dê o seguinte erro:

Rodar o comando:

sudo apt-get install python-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev libsmpeg-dev python-numpy subversion libportmidi-dev ffmpeg libswscale-dev libavformat-dev libavcodec-dev libfreetype6-dev

Depois: pip install pygame

Pronto!


Inicialização

Todo projeto que utiliza essa biblioteca possui as seguintes linhas:

import pygame

pygame.init()



Cores

As cores precisam ser definidas com três valores, que irão representar uma cor no formato RGB (Red Green Blue), sendo que cada valor representa um valor para uma dessas cores primárias. 

A partir dessas cores primárias, podemos gerar qualquer cor, por isso elas são usadas como base.

Exemplos:

BLACK = (    0,     0,   0)

WHITE = (255, 255, 255)

RED      = (255,   0,   0)

GREEN = (  0, 255,   0)

BLUE    = (  0,   0, 255)

YELLOW = (255, 255, 0)

PURPLE = (255,   0, 255)


Link para cálculo de cores: https://www.w3schools.com/colors/colors_rgb.asp


Controlando a tela

Para abrir uma tela, primeiro precisamos definir o tamanho (altura, largura) e, em seguida, passar esse tamanho para o comando pygame.display.set_mode(size).

Exemplo:

size = (700, 500)

screen = pygame.display.set_mode(size)


Para fechar a tela, usamos o comando pygame.display.quit()


Para alterar o título da janela, usamos pygame.display.set_caption(“Titulo da janela”)


Para definir uma cor de fundo: screen.fill(cor)


Para identificarmos que o usuário clicou no botão “fechar” da janela:

for event in pygame.event.get():

    if event.type == pygame.QUIT:

        done = True         


Para definirmos o limite de quadros por segundo (FPS):

clock = pygame.time.Clock()

clock.tick(60) # Limita à 60 fps


Para exibir na tela o que foi desenhado: pygame.display.flip()


Com os comandos acima, já conseguimos criar uma janela em branco que fecha quando clicamos no botão fechar:

import pygame


WHITE = (255, 255, 255)

WINDOW_SIZE = (700, 500)


pygame.init()

screen = pygame.display.set_mode(WINDOW_SIZE)

pygame.display.set_caption("PyGame test")


done = False

clock = pygame.time.Clock()


while not done:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            done = True            

    if not done:

        # Aqui vai a logica do jogo

        # Aqui vai a logica para exibição dos objetos

        screen.fill(WHITE)        

        pygame.display.flip() # Exibe na tela o que foi desenhado        

        clock.tick(60) # Limita para 60 fps

pygame.display.quit() # Fecha a janela




Desenhando na tela

Formas possíveis de desenhar: http://www.pygame.org/docs/ref/draw.html

Para desenhar um retângulo na tela: 

pygame.draw.rect(screen, cor, [x, y, width, height], width)

Se o width for:

  • < 0: não exibe nada
  • = 0: preenche o retângulo
  • > 0: define a largura da borda do retângulo
Exemplo: 

pygame.draw.rect(screen, RED, [50, 150, 20, 200])


Para desenhar uma linha

pygame.draw.line(screen, cor, [x_inicio, y_inicio], [x_fim, y_fim], width)


Para desenha uma elipse

pygame.draw.ellipse(screen, cor, [x, y, width, height], width)


Para desenhar um polígono

pygame.draw.polygon(screen, cor, [[x1, y1], [x2, y2], etc.], width])

Exemplo:

pygame.draw.polygon(screen, PURPLE, [[300, 100], [320, 140], [330, 142], [280, 150], [200, 140]], 2)


Para escrever na tela, são precisos 3 passos:

  • Definir a fonte: font = pygame.font.SysFont(‘nome_da_fonte’, tamanho, negrito, itálico)
  • Usar a fonte para definir um texto, sua cor e se deve ser “anti-aliased”: text = font.render(‘Texto’, anti-aliased, cor)
  • Inserir o texto criado na tela: screen.blit(text, [x, y])
Exemplo:

font = pygame.font.SysFont('Montserrat', 40, True, False)

text = font.render('Lucas Ferraz', True, BLACK)

screen.blit(text, [SCREEN_WIDTH/2, SCREEN_HEIGHT/2])


Para carregar uma imagem:

background_image = pygame.image.load('resources/nebula_2.jpg').convert()
screen.blit(background_image, [0,0]) # [0,0] representa a posição onde a imagem deve ser inserida


Quando carregamos uma imagem com partes transparentes, essa parte será exibida com a cor preta. Para que isso não ocorra, precisamos informar para o pygame que ela deve ser ignorada usando o método colorkey():

player_image = pygame.image.load('resources/player.png').convert()
player_image.set_colorkey(BLACK)


Inserindo Áudios

Para reproduzir um som:

shot_sound = pygame.mixer.Sound('resources/laser5.ogg')
shot_sound.play()

Obs: a biblioteca pygame não consegue reproduzir qualquer formate de arquivo de som. Caso esteja tendo problemas tentando reproduzir um áudio, tente converter o arquivo para o formato ogg-vorbis (.ogg). Uma ferramenta que faz isso é a Audacity (https://sourceforge.net/projects/audacity/)


Para tocar uma música de fundo:

# define a música 
pygame.mixer.music.load('resources/Blackmoor Tides Loop.wav') 

# define o evento a ser chamado quando a música terminar
pygame.mixer.music.set_endevent(pygame.constants.USEREVENT) 

# inicia a música
pygame.mixer.music.play()   

while not done:
        for event in pygame.event.get():
            if event.type == pygame.constants.USEREVENT:
                # reinicia a música quando ela terminar
                pygame.mixer.music.play()



Usando a biblioteca

Caso você queira ver como usar essa biblioteca na prática, veja o post Como criar um jogo usando Python

Template

Abaixo você encontra um template que pode ser usado para basicamente qualquer jogo usando a biblioteca PyGame, com os métodos básicos necessários para abrir uma tela em branco que fecha quando pressiona "Esc" ou clicar no botão fechar da tela:

import pygame

WHITE = (255, 255, 255)
window_size = (700, 700)

def init():
    pygame.init()
    screen = pygame.display.set_mode(window_size)
    pygame.display.set_caption('mouse position')
    clock = pygame.time.Clock()    
    done = False
    
    return screen, clock, done

def quit():
    pygame.display.quit()
    pygame.quit()
    
def main():
    screen, clock, done = init()
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                done = True
            # tratamento das interações do jogador
        
        screen.fill(WHITE)

        # lógica do jogo

        # desenho dos objetos
        
        pygame.display.flip()
        clock.tick(60)
    
    quit()
    
if __name__ == "__main__":
    main()


Interações com usuário

Para que o jogo seja de fato um jogo, é preciso que o usuário tenha algum tipo de interação com ele, seja através do teclado, mouse ou joystick. Veremos abaixo como capturar essas interações.


Teclado

Para identificar a interação através do teclado, precisamos fazer duas validações:

  1. Se o tipo de evento é de tecla pressionada/liberada: 
    1. event.type == pygame.KEYDOWN
    2. event.type == pygame.KEYUP
  2. Qual a tecla pressionada:
    1. event.key == pygame.K_SPACE
    2. event.key == pygame.K_ESCAPE
    3. etc.
Para uma lista com os principais códigos do teclado, acesse o post: 

Mouse

A interação com o mouse pode ocorre de diversas formas:

  • Botão pressionado
  • Movimentação do mouse
  • Scroll

Para capturar o evento de botão pressionado
    event.type == pygame.MOUSEBUTTONDOWN


Para capturar o evento de botão liberado:
    event.type == pygame.MOUSEBUTTONUP


Para identificar qual botão foi pressionado/liberado:
  • event.button == 1 # verifica se foi o botão esquerdo
  • event.button == 2 # verifica se foi o botão do meio (scroll)
  • event.button == 3 # verifica se foi o botão direito
  • etc


Para obtermos a posição do mouse:

    pygame.mouse.get_pos()


Também podemos definir se o mouse deve ficar visível ou não usando o comando pygame.mouse.set_visible(False)




Referências

Comentários

Postagens mais visitadas deste blog

Como criar um jogo usando Python

Biblioteca Python: Random