Você está na página 1de 4

Pygame Tutorial Parte 1

21 abril, 2008

Aqui comea a primeira parte do tutorial sobre Python e Pygame. J falei brevemente sobre esse conjunto num post anterior, ento vamos direto ao assunto. Python pode ser baixado aqui, a ltima verso no momento a 2.5.2. J Pygame pode ser baixado aqui, tive problemas de desempenho com a ltima verso (provavelmente envolvendo a placa de vdeo), o que diminuiu muito a taxa de frames por segundos, ento estou usando a verso 1.7.1, o que no prejudicar a portabilidade do cdigo. Pra quem j programou em outras linguagens, Python pode ser facilmente aprendida atravs do manual que vem na instalao (em ingls). Quem nunca programou tambm pode se dar bem com a prpria documentao da linguagem, ou algum dos tutoriais do Python Brasil. A primeira parte do tutorial e muito simples e aborda somente a inicializao do pygame e estrutura bsica de um jogo. No prximo tutorial explicarei mais sobre janelas e mostrarei as primeiras imagens. O cdigo pode ser baixado aqui, devido a restries de upload do wordpress, no possvel hospedar arquivos .py ou .zip e afins, logo basta remover a extenso .doc e usar normalmente. Na segunda parte do tutorial sobre Pygame veremos como adicionar e mover objetos na tela. Usaremos principalmente as classes Surface e Rect. Uma breve descrio das classes. Surface: Os objetos da classe Surface so usados para manusear imagens. Podem ser criados diretamente atravs de pygame.surface.Surface ou indiretamente, a partir de uma imagem guardada em disco com pygame.image.load ou na criao da janela do jogo com pygame.display.set_mode. As imagens carregadas com pygame.image.load podem ser de qualquer tipo, dentre os mais comuns, bmp, jpg, gif, png e alguns outros. As transparncias so automaticamente criadas para imagens que as permitem. recomendado o uso dos mtodos convert e convert_alpha que convertem a quantidade de bytes por pixels da imagem para a mesma da tela, o que facilita a impresso. O mtodo mais importante dessa classe e o blit. Com ele voc pode imprimir uma imagem em outra, o que feito com freqncia na Surface da tela. Rect: A classe Rect e simplesmente a abstrao de um retngulo. Nela h dados como x e y, que so as posies inicias do retngulo, e w e h, que so a largura e altura do seu retngulo. H tambm mtodos para checagem de coliso, movimentao e unio. Abaixo eu mostro o resultado do programa de exemplo, que simplesmente uma bola se movendo na tela. o tutorial anterior eu disse que da prxima vez falaria sobre eventos e as funes de desenho. Entretanto, o exemplo de jogo que eu sugeri, que foi o Pong, exige que eu explique alguns conceitos de manipulao de tempo e se eu falasse sobre tudo isso num mesmo tutorial seria muita coisa.

Vamos ento comear pelo mdulo draw, que permite desenhar formas bsicas em uma superfcie. Caso voc precise usar somente um retngulo ou circunferncia no ser necessrio criar um bitmap com essa imagem o que d uma certa facilidade durante a programao e diminui o tamanho final do seu jogo. Todas as funes recebem como primeiro e segundo argumento respectivamente: a superfcie a ser desenhada e a cor do desenho. O ltimo argumento geralmente representa a espessura da linha, caso esse valor seja zero, a figura ser desenhada cheia. Essas funes retornam um retngulo que indica qual parte da superfcie foi alterada, assim possvel atualizar somente a rea modificada. A documentao completa desse mdulo pode ser encontrada aqui. Apesar do contedo estar em ingls ele bem intuitivo e acredito que ningum ter muitos problemas. Com criatividade e disposio d pra fazer qualquer coisa somente com essas primitivas. Eu que no tenho nenhum dos dois consegui fazer algo.

No programa da figura acima eu fiz uma funo que desenha crculos concntricos onde a cor to escura quanto menor foi seu raio.

1 def ball (surface, color, center): 2 dr = color[0] / 32.0 3 dg = color[1] / 32.0 4 db = color[2] / 32.0 5 for i in range (32, -1, -1): 6 pygame.draw.circle (surface, (dr * i, dg * i, db * i), center, i)

E a usei da seguinte forma:

1 ball (self.screen, (255, 0, 0), (32, 32)) 2 ball (self.screen, (0, 255, 0), (96, 32)) 3 ball (self.screen, (0, 0, 255), (160, 32)) 4 ball (self.screen, (255, 255, 0), (224, 32)) 5 ball (self.screen, (255, 0, 255), (288, 32)) 6 ball (self.screen, (0, 255, 255), (352, 32)) 7 ball (self.screen, (255, 255, 255), (416, 32))

Agora com relao classe Clock, o nico mtodo dela que usarei ser o tick. Esse mtodo recebe quantos frames por segundo voc deseja que o seu programa rode e garante que a velocidade seja no mximo essa.

Com essas ferramentas possvel comear a criar o Pong. Pra quem no conhece (impossvel!) o jogo constitudo de uma bola que deve ser rebatida pelos jogadores. Quando um a deixa passar, o outro marca um ponto. No cdigo, que pode ser baixado aqui, h somente o que pode ser visto na figura abaixo, alm de uma explicao melhor sobre o mdulo draw. No prximo tutorial, quando finalmente veremos os eventos, j ser possvel jogar alguma coisa. Avanando na criao do nosso jogo, agora vamos adicionar os movimentos da bola e tornar os jogadores interativos atravs do mouse e teclado, para isso vamos ver uma pouco sobre eventos. Em Pygame uma fila com os eventos ocorridos automaticamente mantida pelo sistema para facilitar sua manipulao. Cada novo evento gerado adicionado ao final dessa fila, que deve ser percorrida em todos os frames fazendo uma iterao sobre o retorno da funo pygame.event.get (). Abaixo um exemplo de como detectar se a tecla esc foi pressionada para terminar o jogo.
view source

print?

1 def play (self): 2 while True: 3 for event in pygame.event.get (): 4 if event.type == KEYDOWN and event.key == K_ESCAPE: 5 exit ()

Nesse trecho de cdigo a fila checada constantemente a procura de eventos, caso algum deles ocorra verificado se ele corresponde a uma tecla apertada e se essa tecla o esc, se sim termina o jogo. Foram feitas vrias mudanas no cdigo, que voc pode baixar aqui, dentre elas a mais importante a extino da classe Player. Em seu lugar entraram as classes Keyboard e Mouse. Elas controlam os jogadores atravs de eventos produzidos pelo teclado e mouse.

Em Game foram feitas alteraes importantes em todos os mtodos, principalmente em play que agora verifica os eventos produzidos para mover os jogadores. Na classe Ball foi acrescentado o mtodo move, que deve ser chamado a cada frame para movimentar a bola de acordo com a velocidade. O mtodo update foi modificado para considerar os limites da tela no deslocamento do objeto. O cdigo, como sempre, possui alguns bugs, por exemplo se a bola atingir os jogadores lateralmente ela ficar oscilando entre as extremidades da barra. Isso pode ser facilmente resolvido delimitando uma rea diferente de colises entre a bola e os jogadores ou a bola e o campo. No prximo tutorial colocaremos um placar no jogo para contar os pontos e indicar um vencedor. Para isso mostrarei como imprimir textos na tela, usando diversas fontes, e como criar eventos personalizados.