Este documento fornece uma introdução ao Pygame, uma biblioteca gráfica para Python que permite a criação de jogos. Ele explica como funcionam os principais componentes de um jogo no Pygame, incluindo eventos de mouse e teclado, módulos para imagens, sons, sprites e tempo.
4. Introdução
O que é Pygame ?
Pygame é uma biblioteca gráfica, ou seja, um
conjunto de módulos, a partir do qual é possível
criar aplicações visuais próprias para jogos.
Disponibiliza funções para interação com o mouse,
teclado, joystick e webcam.
Disponibiliza funções para tratar da tela, sons,
personagens e eventos do jogo.
6. Introdução
Vantagens
Portável
(Windows, Linux, Mac OS, SymbianOS, Nokia)
Mais de 1000
Documentação projetos
disponível no site disponíveis
no site
7. Introdução
Instalando
No site você pode baixar o código fonte ou o
instalador
Versões compatíveis com Python 2.7 e 3.2
Testar se o Pygame está instalado corretamente
>>> import pygame
>>>
8. Introdução
Instalando
Num SO Linux, é possível instalar com o seguinte
comando
sudo apt-get install python-pygame
9. Como funciona um jogo em Pygame ?
Um “Hello World”
exibindo uma imagem (p1_HelloWorld.py)
exibindo um texto (p2_HelloWorld2.py)
10. Como funciona um jogo em Pygame ?
Posicionamento da imagem
“Movimentando” a imagem (p3_animacao.py)
Eventos (events )
Qual a principal característica de um jogo?
Interação com o jogador
Interação com os events
11. Como funciona um jogo em Pygame ?
Capturando events (p4_bouncer.py)
pygame.event.get()
Retorna uma lista de eventos
QUIT
KEYDOWN
KEYUP
MOUSEBUTTONUP
MOUSEBUTTONDOWN
12. Como funciona um jogo em Pygame ?
Utilizando events
event.type
event.key
Utilizando key, mouse
key.get_pressed()
mouse.get_pressed)
mouse.get_pos()
13. Eventos do mouse
pygame.mouse.get_pos() (menu.py)
Retorna uma tupla (x, y) referente à posição
pygame.mouse.get_pressed()
Retorna uma tupla (button1, button2, button3)
Cada posicao da tupla é um boolean
Ex.: pygame.mouse.get_pressed()[0]
Indica se o botão esquerdo foi pressionado
14. Eventos do teclado
Podemos capturar as teclas pressionadas de duas
formas:
Usando o pygame.event.get():
# Capturando eventos do taclado a partir
#do pygame.event.get()
for event in pygame.event.get():
if event.type == KEYDOWN: # Ou KEYUP
if event.key == K_ESCAPE:
...
15. Eventos do teclado
Ou usando o pygame.key.get_pressed(), que retorna
uma lista com booleans:
# Capturando eventos do teclado
# a partir do pygame.key.get_pressed()
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_ESCAPE]:
...
As constantes (K_ESCAPE, K_f, etc) representam o
índice referente à cada tecla dessas listas
16. Algumas teclas
Constante Nome da tecla
K_ESCAPE “Esc”
K_RETURN Enter
K_BACKSPACE Backspace
K_SPACE Barra de espaço
K_a, K_b, ..., K_z Teclas de A a Z
K_LEFT Seta para esquerda
K_RIGHT Seta para direita
K_UP Seta para cima
K_DOWN Seta para baixo
K_0, K_1, ..., K_9 Teclas de 1 a 9
K_LSHIFT, K_RSHIFT Shift esquerdo e direito
K_LCTRL, K_RCTRL “ctrl” esquerdo e direito
K_LALT, K_RALT “Alt” esquerdo e direito
17. Onde encontrar?
Documentação do Pygame
Mouse: http://www.pygame.org/docs/ref/mouse.html
Teclado: http://www.pygame.org/docs/ref/key.html
18. Principais Módulos
Image – Manipulação de imagens do sistema
Mixer.Sound – Sons simples, efeitos sonoros
Mixer.Music – Player de músicas
Sprite – Objetos de colisão, ex: personagens
Time – Manipulação do tempo no jogo
Font – Criar textos e renderizar em imagens
19. Image
Funções para lidar com as imagens externas ao Pygame.
Pygame.image.load(filename)
(p5_convert_e_convert_alpha.py)
Carrega uma imagem do sistema para o jogo
Formatos suportados: BMP, TGA, GIF (não
animado), JPEG, PNG, TGA, dentre outras
# Carrega uma imagem para o Pygame.
# OBS: Carrega, NÃO blita ela na tela!
img_pedra = pygame.image.load(“images”+os.sep
+”pedra.gif”).convert()
img_garrafa = pygame.image.load(“images”+os.sep+”objetos”
+os.sep+“garrafa.png”).convert_alpha()
20. Image
Para que os códigos anteriores funcionem
corretamente, veja a organização dos arquivos:
programa.py
images/
pedra.gif
objetos/
garrafa.png
21. Image
Pygame.image.save(Surface, filename)
Salva uma imagem carregada no Pygame
(Surface) como um arquivo de imagem no
sistema.
Formatos suportados:
BMP, TGA, PNG, JPEG
# Salvando uma imagem no sistema
# Neste pontos existe uma imagem na variável img_desenho
pygame.image.save(img_desenho, “images”+os.sep+”desenhos”
+os.sep+”desenho1.jpg”)
22. Image
É possível, a partir de uma imagem, obter um rect
(retângulo)
Útil para detectar colisões
colliderect(other_rect)
collidepoint(point)
img = pygame.image.load(“img.png”).convert()
img2 = pygame.image.load(“img2.png”).convert()
rect1 = img.get_rect() #podemos mudar o centro com:
rect2 = img2.get_rect() #rect1.center = x, y
colidiu = rect1.colliderect(rect2)
23. Image
Dica 1: tornando o background transparente
def remove_background(image):
try:
img = pygame.image.load('images' + os.sep + image)
except:
print 'Error: image %s not found' % image
# Torna a cor do pixel na posicao (0,0) transparente
loaded_image = img.convert()
color = loaded_image.get_at((0,0))
loaded_image.set_colorkey(color, RLEACCEL)
return loaded_image
24. Image
Dica 2: carregando “subimagens”
def load_subsurfaces(image, subsurfaces):
try:
img = pygame.image.load('images' + os.sep + image)
except:
print 'Error: image %s not found' % image
images = []
for rect in subsurfaces:
sub = img.subsurface(rect).convert()
images.append(sub)
return images
25. Image
Dica 2: carregando “subimagens”
n = 10 #numero de subsurfaces
size = pygame.image.load('img.png').convert().get_size()
images = load_subsurfaces('img.png',
[((x,0),(size[0]/n,size[1])) for x in xrange(0, size[0],
size[0]/n)])
26. Mixer
É possível manter vários sons tocando ao mesmo
tempo
É possível parar um ou todos os sons de uma vez
pygame.mixer.stop()
Para a execução de todos os sons
Pygame.mixer.unpause()
Recomeça a execução dos sons parados
27. Sound
pygame.mixer.Sound(filename) (p6_bouncer_com_som.py)
Retorna um objeto Sound, que pode ser executado e
parado quando você quiser
Formatos suportados: OGG e WAV (descomprimido)
# Carrega uma som de colisão para o jogo.
som_colisao = pygame.mixer.Sound(“sounds”+os.sep+”toc1.wav”)
…
if acontece a colisao:
som_colisao.play(1) # inteiro é o numero de repetições
som_colisao.set_volume(0.7) # 0 <= volume <= 1.0
28. Music
Interno ao módulo Mixer
Executa músicas durante o jogo.
(p7_bouncer_som_e_musica.py)
Pode executar apenas uma música por vez.
Formatos suportados:
MP3 e OGG
# Carrega uma música ambiente para o jogo.
pygame.mixer.music.load(“musics”+os.sep+”jazz_and_blues1.mp3
”)
pygame.mixer.music.play(-1) # Toca a música infinitamente
pygame.mixer.music.set_volume(0.9) # 0 <= volume <= 1.0
pygame.mixer.music.fadeout(3000) # Diminui o volume de
acordo com o tempo em milisegundos
29. Sprite
Módulo próprio para os
objetos, personagens, e
cenário do jogo
Um Sprite é a forma usada rect = (x, y)
para representar um item do
jogo. Possui uma posição
(na tela) e uma imagem
image = pygame.surface
As fuções do módulo sprite
lidam com objetos Sprite()
Pygame.sprite.Sprite() Sprite bola
Sprite.rect
Sprite.image
30. Sprite
Várias funcões do módulo sprite são para detecção
de colisão.
Pygame.sprite.collide_mask(sprite_a, sprite_b)
Retorna um bool indicando se as imagens dos
dois sprites estão se sobrepondo (colidindo)
# Verifica se dois Sprites estão colidindo.
# Neste ponto devem existir dois sprites, bola e parede.
if pygame.sprite.collide_mask(bola, parede):
som_colisao.play(1)
# mude a direção da bola ou
# faça o jogador perder uma vida e recomece o jogo
31. Sprite
pygame.sprite.collide_rect(sprite_a, sprite_b)
Detecção de colisão entre dois sprites,
usando rect (posicionamento e dimensões)
Pygame.sprite.collide_circle(sprite_a, sprite_b)
Detecção de colisão usando áreas circulares
Outras funções do módulo sprite permitem
outros tipos de verificação (por grupos de
sprites, por camada)
32. Time
Módulo responsável pela informação sobre o
tempo no jogo.
Muito útil em jogos que possuem muitos
movimentos e objetos acelerados
Regula a movimentação dos objetos na tela
Evita diferença de execução entre máquinas
diferentes
33. Time
# Cria um relógio pygame.time.Clock()
clock = pygame.time.Clock()
… Cria um relógio que
serve para obter a
x , y = (10, 5) variação de tempo ao
vel_x, vel_y = 7, 3 longo do programa
…
While True: Clock.tick()
delta_tempo =
clock.tick() Retorna o tempo, em
… milisegundos, desde
a última chamada
x += vel_x * delta_tempo deste método
y += vel_y * delta_tempo
Uma vez por loop
# S = S0 + v * t
34. Font
Permite renderizar TrueType Fonts (*.TTF) em
imagens para o jogo
Permite a utilização de fontes extras, especiais
pygame.font.Font(filename)
Carrega uma fonte do sistema
Formato suportado: TTF
# Carrega uma fonte colocada na pasta pessoal game_fonts
fonte_jogo =
pygame.font.Font(“game_fonts”+os.sep+”showgothic_card.ttf”)
35. Font
Font.render(texto, antialias, cor)
Renderiza (Interpreta a fonte e converte em uma
imagem) o texto na cor desejada
O retorno é uma imagem do Pygame (Surface)
…
tela = pygame.display.set_mode((800, 600), 0, 32)
# Carrega uma fonte colocada na pasta pessoal game_fonts
fonte_jogo =
pygame.font.Font(“game_fonts”+os.sep+”showgothic_card.ttf”)
tela.blit(fonte_jogo.render(“Que bom!”, True, (255, 0, 0)),
(200,
150))