Você está na página 1de 5

Aprendendo PyGame na prtica

por Pedro Vtor Marques Nascimento

Introduo{Um pouco sobre PyGame}


Bem-vindo{Vem sempre aqui?}
Este tutorial tem como foco introduzir algumas funes do PyGame para iniciantes. Se voc j teve
contato com alguma forma de programao de jogos voc perceber que usar Python torna tudo mais fcil e
rpido.
O primeiro jogo que criaremos o que eu chamo de Robot Attack que um timo exemplo de
como criar um jogo em 2D sem ir muito a fundo na teoria de uma linguagem. Nele usaremos funes,
classes, msica, animaes e, claro, eventos. Ser uma tima oportunidade para aprender ou relembrar
antigos conhecimentos j engavetados.
Uma coisa que voc facilmente vai perceber que para programar jogos voc deve acima de tudo
gostar de programar. Sim, parece obvio, mas as vezes no fica claro para todos que desenvolver jogos
muito semelhante com criar um programa. Se voc no gosta de criar programas, dificilmente se animar na
criao de jogos.
De qualquer forma, junte seu folego, concentre sua animao e prepare uma xcara de caf, pois est
na hora de comear a pr a mo na ma No! Primeiro vamos tirar algumas duvidas...
Preciso saber Python? claro que sim. O PyGame, em termos leigos, simplesmente um
complemento ao Python e apenas permite que voc use algumas funcionalidades visuais inditas. Tirando
algumas funes especficas, o resto todo Python e lgica de programao. Por isso que afirmei que quem
no gosta de programar dificilmente gostar de desenvolver jogos.
Este tutorial no ensinar Python, pois existem diversos tutoriais disponveis na internet sobre a
linguagem. Todas as minhas dicas estaro no final da apostila e isso inclui livros, sites, blogs, apostilas e
Online Judges.
Preciso saber Fsica? Sim, mas no precisa ser um conhecimento muito avanado na maior parte
dos projetos. Como programar uma bola rebatendo numa rampa se no conhece a lei da reflexo? A boa
notcia que sempre teremos o bom e velho Google para nos ajudar em dvidas pontuais. Por favor, no se
desespere.

Estrutura do PyGame{Organizao bsica}


Todo jogo em PyGame ter uma estrutura bsica cujo objetivo organizar o ambiente de trabalho no
cdigo. Ele ficar mais limpo, as coisas ficaro mais fceis de visualizar e o melhor, o risco de obter um erro
menor. Alis, isso uma boa dica: quanto mais organizado, menos erros um cdigo ter. Deve ter uma
frmula fsica provando isso.
Agora falando em termos de PyGame, podemos estabelecer uma ordem onde em cada tpico
teremos parte do cdigo organizado. Se estiver usando mais de um arquivo para executar, poder ter a
retirada de algumas espcies como funes e classes. A ordem padro esta:
#IMPORTAES DE BIBLIOTECA
#DEFINIES DE IMAGENS, UDIOS, ETC
#INICIALIZAES

#CONVERSES
#CLASSES
#FUNES
#LOOP PRINCIPAL
#OUTROS LOOPS
Exemplo de cdigo seguindo tal estrutura est abaixo. No irei explic-lo agora, at porque este no
o intuito do captulo. Apenas quero mostrar uma boa maneira de organizar o cdigo.
#IMPORTAES
import pygame
from pygame.locals import *
from sys import exit
#DEFINIES
background_image_filename = 'sushiplate.jpg'
mouse_image_filename = 'fugu.png'
#INICIALIZAES
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
pygame.display.set_caption("Hello, World!")
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#LOOP PRINCIPAL
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
screen.blit(background, (0,0))
x, y = pygame.mouse.get_pos()
x-= mouse_cursor.get_width() / 2
y-= mouse_cursor.get_height() / 2
screen.blit(mouse_cursor, (x, y))
pygame.display.update()
Pode falar a verdade, voc se assustou com o cdigo? A princpio talvez ele parea estranho e
intimidador, mas calma que esse s o seu comeo, com o tempo voc pega o jeito e j vai saber cada linha
de cabea.

A essncia da programao de jogos{O que so eventos?}


Ao programar jogos voc vai notar que algumas coisas so bem diferentes de programar no console,
por exemplo. Quando ns trabalhamos com jogos, ns usamos eventos para definir o que vai acontecer na
tela.
Um exemplo bem claro disso: O jogo fica com a tela preta at voc apertar a tecla espao. Receber
a informao que a tecla foi pressionada um evento para o jogo e neste caso ele responde a isso.
Em um algoritmo rpido:
cor da tela = preto // definimos a cor inicial como preto

enquanto o jogador no sair: //este o loop principal


receba eventos: //recebendo eventos
Se o jogador sair: //evento1: o jogador aperta o boto de sair na janela
fechar //ao se o evento acontecer
Se a tecla ESPAO foi pressionada: //evento2: o jogador pressiona ESPAO
cor da tela = branco //muda a cor da tela
S por curiosidade, no PyGame ficaria assim:
cor da tela = (0,0,0)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
if event.type == K_SPACE:
cor da tela = (255,255,255)
screen.fill(cor da tela)
Vamos l! No est to complicado, est? O jogo fica no loop while True at receber ordens de
sair. Enquanto estiver dentro, toda vez que passar por aquele for event in pygame.event.get() ele vai coletar
as mudanas e vai tentar detectar eventos a partir disso.
Essa lgica serve para TUDO na programao de jogos. Outro exemplo, este mais legal:
posX,posY = 0,0 //posio inicial do personagem
Enquanto o jogador no sair:
receba eventos:
Se a tecla CIMA foi pressionada:
posY -= 1 //atualiza a posio
Se a tecla BAIXO foi pressionada:
posY += 1 //atualiza a posio
Se a tecla ESQUERDA foi pressionada:
posX -= 1 //atualiza a posio
Se a tecla DIREITA foi pressionada:
posX += 1 //atualiza a posio
Desenhe o personagem em (posX,posY)
Que em PyGame ficaria:
posX,posY = 0,0
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
if event.type == K_UP:
posY -= 1
if event.type == K_DOWN:
posY += 1
if event.type == K_LEFT:
posX -= 1
if event.type == K_RIGHT:
posX += 1
screen.fill(0,0,0)
screen.blit(personagem,(posX,posY)

No se force a entender tudo do PyGame, s coloquei isto aqui para ir introduzindo algumas
definies e perguntas na sua mente. Por que te um K_ na frente do nome das teclas? O que
screen.blit? Por que voc usou screen.fill? CALMA! Tudo ser respondido em breve.
Agora que voc j entendeu parte da essncia dos eventos, que tal mandarmos um Ol para o
computador?

Hora de dizer um ol!{Fazendo o SEU programa visual!}


Nesta sesso utilizaremos a lgica simples acima para dar nosso Ol para o computador. Vamos l?
Vou apresentar a ideia e ns tentaremos execut-la juntos.
Ideia: Um jogo que quando voc aperta espao aparece uma tela escrita Al, Mundo!. Alm
disso, quando se aperta nos direcionais esta mesma tela se direciona sutilmente para a direo escolhida pelas
setas.
Lgica por escrito: Enquanto o jogo estiver aberto esperar por eventos do tipo apertar tecla. Se
for espao, ele mostra uma tela branca com os dizeres Alo Mundo; se for cima,esquerda,direita ou
baixo o programa desloca a superfcie para a direo escolhida. Quando o boto direcional liberado a
imagem volta ao centro.
Portugol:
Tela = 640px por 480px, imagens em 32 bits, tela de tamanho fixo
Imagem = fundo1.png
Alo Mundo = aloMundo.png
x,y = 0,0 // valor inicial
Enquanto o jogo estiver aberto:
Receba eventos:
Se o evento for SAIR:
Se for do tipo KEY DOWN: // pressionou o boto
Se o boto for ESPAO:
Se o boto for CIMA:
y=y-5
Se o boto for BAIXO:
y=y+5
Se o boto for ESQUERDA:
x=x-5
Se o boto for DIREITA:
x=x+5
Se for do tipo KEY UP: //soltou o boto
Se o boto for CIMA:
y=0
Se o boto for BAIXO:
y=0
Se o boto for ESQUERDA:
x=0
Se o boto for DIREITA:
x=0
Imprima a imagem n na tela a partir da coordenada x,y
Atualize a tela;
Escrito em PyGame:

Funes bsicas{Definies bsicas}


screen.blit()
Descrio: Imprime uma determinada imagem no display em uma determinada posio;
Entrada: a imagem e a coordenada;
Sada: sem sada, apenas imprime a imagem no display;

Exemplo: screen.blit(imagem,(0,0))
pygame.image.get_width()
pygame.image.get_height()
pygame.display.set_mode()
pygame.mixer.Sound()
pygame.Sound.play()
pygame.mixer.set_num_channels()
pygame.image.load().convert()
pygame.image.load().convert_alpha()
pygame.time.Clock()
pygame.mouse.set_visible()
pygame.display.set_caption()
pygame.font.SysFont()
pygame.mouse.get_pressed()
screen.fill((0,0,0))
pygame.display.update()
clock.tick(60)

We make a game{Vamos criar nosso jogo!}