Documentação Python para Jogos
Documentação Python para Jogos
Documentação Python para Jogos
28 de abril de 2005
Python fcil! e a
Linguagem de alto n bem parecida com o modo que pensamos, vel ideal para fazer a inteligncia de um jogo e
for elemento in elementos : if elemento . tipo in tipos_inimigos : atir e_no_elemento ( elemento )
Problemas e Solues co
Nem tudo so maravilhas, o principal problema : a e Python lento: Python no ideal para fazer processamento de e a e imagens, iteraes sobre grandes matrizes etc. co Soluo: Quando a velocidade comear a ser um ca c problema, analise o seu cdigo em um proler e o otimze tal regio, talvez implemente-a em a C/Assembly. Na verdade grande parte disso j est feito, o PyGame utiliza a a a biblioteca SDL, que feita em C. Existem tambm implementaes e e co de engines bem otimzados que so utilizveis no Python. a a
PyGame
Como o Python, multiplataforma e Fcil de utilizar a Possui bastante recursos Rpida o suciente a
import pygame pygame . init () screen = pygame . display . set_mode ( ( 800 , 600 ) ) image = pygame . image . load ( " minha_imagem . png " ) while True : for event in pygame . event . get (): if event . type == pygame . QUIT : break screen . fill ( ( 0 , 0 , 0 ) ) screen . blit ( image , image . get_rect () ) pygame . display . flip ()
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
Surface o que ? e
Surface so superf a cies nas quais se desenha. Podem ser 2D ou 3D, residir em memria do sistema ou da placa de v o deo e tambm e ter vrias profundidades de cores. a tamanho = ( 640 , 480 ) cor = ( 255 , 0 , 0 ) # v e r m e l h o superficie = Surface ( tamanho ) superficie . set_at ( ( 10 , 20 ) , cor ) superficie . fill ( cor , ( 11 , 21 , 50 , 50 ) ) tela = pygame . display . set_mode ( tamanho )
ll( cor, area ) Preenche uma rea com a cor a get at( posicao ) Pega a cor que est na posio a ca set at( posicao, cor ) Muda a cor da superf na posio cie ca blit( origem, posicao, area origem ) Copia a parte limitada por area_origem da superf origem para a posio cie ca desejada na superf atual. cie
Surface transparncias e
As superf cies suportam 3 tipos de transparncia: e Colorkey neste modo uma cor designada para representar a e transparncia, isto , ao fazer o blit os pontos com e e esta cor no sero copiados. a a Image Alpha neste modo a superf como um todo tem um valor cie de translucidez entre 0 (transparente) e 255 (opaco), ao fazer o blit desta superf em outra cada ponto cie resultante uma mdia da origem com o destino e e proporcional a este valor. Este modo pode ser utilizado em conjunto com o colorkey Per-Pixel Alpha neste modo cada ponto da superf tem um cie componente de Alpha associado que levado em e conta na hora do blit. Estas superf cies so chamadas a de 32bpp RGBA. Este modo no pode ser utilizado a com os dois primeiros.
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
Quando no usar: quando se quer utilizar per-pixel alpha no a a converta para a profundidade de cor da tela, pois ele perder tal a recurso, neste caso utilize convert_alpha().
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
Rect o que ? e
Rect representa retngulos, com posio e dimenses. Parece a ca o
irelevante, mas uma das classes mais uteis de todo PyGame pois e ela fornece operaes que so muito utilizadas, facilitando o co a desenvolvimento do jogo
r = Rect ( ( 10 , 10 , 50 , 100 ) ) print r . top , r . bottom # 1 0 1 1 0 print r . left , r . right # 1 0 6 0 print r . midtop , r . midleft # ( 3 5 , 1 0 ) ( 1 0 , 6 0 ) print r . center # ( 3 5 , 6 0 ) c1 = r . collidepoint ( 30 , 40 ) c2 = r . colliderect ( ( 0 , 0 , 100 , 200 ) ) r2 = r . inflate ( 10 , 10 ) r2 . move_ip ( 5 , 5 )
display o que ? e
O mdulo display utilizado para manipular a tela. o e
modos = pygame . display . list_modes () tela = pygame . display . set_mode ( modos [ 0 ] ) rect = pygame . Rect ( 0 , 0 , 10 , 10 ) pygame . display . set_caption ( " Teste do PyGame " ) while tela . get_rect (). contains ( rect ): tela . fill ( ( 0 , 0 , 0 ) ) tela . fill ( ( 255 , 0 , 0 ) , rect ) rect . move_ip ( 10 , 10 ) pygame . display . flip ()
draw o que ? e
O PyGame tem vrios recursos para desenhar nas superf a cies.
from pygame . draw import line , circle , polygon tela = pygame . display . get_surface () line ( tela , ( 255 , 0 , 0 ) , ( 0 , 0 ) , ( 10 , 10 ) ) circle ( tela , ( 0 , 255 , 0 ) , ( 20 , 20 ) , 20 , 2 ) rect ( tela , ( 0 , 0 , 255 ) , ( 10 , 10 , 50 , 50 ) ) polygon ( tela , ( 255 , 255 , 0 ) , [ ( 200 , 200 ) , ( 210 , 190 ) , ( 220 , 200 ) , ( 210 , 210 ) , ( 220 , 220 ) , ( 200 , 220 ) ] ) pygame . display . flip ()
line( supercie, cor, inicio, m, espessura ) desenha uma linha. circle( supercie, cor, posicao, raio, espessura ) desenha um c rculo. rect( supercie, cor, retangulo, espessura ) desenha um retngulo. a polygon( supercie, cor, lista pontos, espessura ) desenha um pol gono.
image o que ? e
O PyGame tem recursos para ler e salvar imagens. Por padro o a formato Bitmap(BMP) suportado, porm se a biblioteca e e SDL Image estiver instalada vrios outros formatos sero a a suportados, dentre eles PNG, GIF, JPEG.
if pygame . image . get_extended (): nave = pygame . image . load ( " nave . png " ) else : nave = pygame . image . load ( " nave . bmp " ) pygame . image . save ( tela , " screenshot . bmp " )
load( arquivo ) l a imagem do arquivo. e save( supercie, arquivo ) salva a superf em um arquivo. cie get extended() retorna verdadeiro se a biblioteca SDL Image estiver instalada.
event o que ? e
Mdulo que cuida dos eventos dentro do PyGame. Voc pode o e utilizar duas tcnicas para trabalhar com eventos: e Usar a la de eventos. Todo evento causado (movimento do mouse, tecla pressionada, ...) geram eventos que vo para a a la de eventos a qual voc pode consultar e tomar as aes e co necessrias. A vantagem que nunca se perde um evento, a a e desvantagem que pode adicionar latncia na resposta e e e tambm precisa-se manter estados para combinar aes (i: e co e duas teclas simultaneamente). Consultar diretamente os dispositivos. A vantagem que e pode vericar vrios estados ao mesmo tempo, porm tem a a e desvantagem de perder eventos (i: o usurio solta o boto do e a a mouse justamente quando voc verica o estado). e
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
from pygame . locals import * for event in pygame . event . get (): if event . type == QUIT : sys . exit () elif event . type == KEYDOWN : print event . key
Nesta tcnica voc deve utilizar o mdulo que trata de cada e e o dispositivo e periodicamente chamar a funo pump() do sistema ca de eventos para que seu programa no trave. a
from pygame . locals import * while not ( pygame . mouse . get_pressed ()[ 0 ] or \ pygame . key . get_pressed ()[ K_SPACE ] ): pygame . event . pump ()
font o que ? e
Mdulo para trabalhar com fontes True Type. Ele s est o o a habilitado caso voc tenha a biblioteca SDL ttf instalada. e
tela = pygame . display . set_mode ( ( 640 , 480 ) ) if pygame . font : font = pygame . font . Font ( " fonte . ttf " , 12 ) font . set_underline ( True ) img = font . render ( " Ol Mundo " , True , a ( 255 , 255 , 0 ) ) tela . blit ( img , ( 0 , 0 ) ) pygame . display . flip ()
Estas so as operaes da classe Font: a co render( texto, antialias, cor frente, cor fundo ) retorna uma superf com o texto desenhado. cie size( texto ) calcula qual ser o tamanho da superf necessria a cie a para desenha o texto. set italic( opcao ) habilita ou desabilita o texto em itlico. a set bold( opcao ) habilita ou desabilita o texto em negrito. set underline( opcao ) habilita ou desabilita sublinhar o texto.
transform o que ? e
Transform um mdulo para auxiliar modicar superf e o cies, ele tem operaes para rotacionar, espelhar, modicar o tamanho e cortar co superf cies.
img = pygame . image . load ( " minha_imagem . png " ) from pygame . transform import flip , scale , rotate ponta_cabeca = flip ( img , False , True ) inclinada = rotate ( img , 45 ) novo_tam aumentada = img . get_rect (). inflate ( 5 , 5 ) = scale ( img , novo_tam . size )
ip( supercie, x, y ) espelha a imagem horizontal e verticalmente, dependendo se x e y forem verdadeiros ou falsos. rotate( supercie, angulo ) rotaciona a imagem scale( supercie, tamanho ) aumenta ou diminui uma imagem.
mixer o que ? e
Mdulo para trabalhar com sons e canais de reproduo. Por o ca padro existem 8 canais para reproduo simultnea. a ca a
from pygame . locals import * musica = pygame . mixer . Sound ( " musica_fundo . wav " ) efeito = pygame . mixer . Sound ( " efeito . wav " ) aviso = pygame . mixer . Sound ( " aviso . wav " ) musica . play ( -1 ) while True : for e in pygame . event . get ( [ KEYDOWN ] ): if e . key == K_SPACE : efeito . play () elif e . key == K_ESCAPE : musica . fadeout ( 1500 ) aviso . play ()
Sound( arquivo ) cria uma nova instncia de objeto de som. a fadeout( tempo ) demora o tempo requerido para deixar todos os canais mudos, o volume vai abaixando gradualmente. pause() pra temporariamente a reproduo de todos os a ca canais. stop() pra a reproduo de todos os canais. a ca unpause() restaura a reproduo dos canais parados. ca
Clock o que ? e
Classe para trabalhar com tempo, atrasar a execuo (e ca consequentemente limitar os quadros por segundo) e tambm e obter tempo entre os quadros.
clock = pygame . time . Clock () FPS = 60 while True : clock . tick ( FPS ) print " Quadros por segundo : " , clock . get_fps ()
A operao mais usada tick( atraso ) que serve para manter ca e uma taxa de quadros por segundo.
sprite O que ? e
Sprite uma imagem bi-dimensional que faz parte de uma cena e maior, isto , os componentes que aparecem no jogo. e O PyGame traz um mdulo com vrios utilitrios para trabalhar o a a com Sprites e tornar o desenvolvimento muito mais fcil. As a classes bsicas so: a a Sprite deve ser herdada pelos componentes do seu jogo. Group serve para agrupar Sprites, existem especializaes co desta classe para ajudar com tarefas rotineiras.
sprite.Sprite o que ? e
componentes do seu jogo. Ela implementa mtodos necessrios e a pelas classes de grupo e mantm a lista de grupos a qual pertence. e oe a Um Sprite s considerado vivo se est dentro de um grupo.
sprite.Group o que ? e
Group a classe bsica que contm sprites, existem vrias e a e a
especializaes: co GroupSingle mantm apenas o ultimo sprite adicionado. e RenderUpdates implementa o mtodo draw( superficie ) que e desenha todos os sprites do grupo na superf e cie retorna a lista de reas modicadas, ento podemos a a utilizar a tcnica de Dirty Rectangles apenas fazendo: e pygame.display.update( meugrupo.draw( tela ) ). OrderedUpdates especializao de RenderUpdates, mas faz as ca atualizaes na ordem em que os sprites foram co adicionados.
#! / u s r / b i n / e n v p y t h o n from copy import copy import pygame from pygame . locals import * from pygame . sprite import Sprite , RenderUpdates
class Bola ( Sprite ): def __init__ ( self , pos , * grupos ): Sprite . __init__ ( self , * grupos ) self . rect = Rect ( 0 , 0 , 100 , 100 ) self . rect . center = pos # C r i a imagem r = self . rect self . image = pygame . Surface ( r . size ) self . image . set_colorkey ( ( 0 , 0 , 0 ) ) self . image . fill ( ( 0 , 0 , 0 ) ) pygame . draw . circle ( self . image , ( 255 , 255 , 255 ) , ( r . width / 2 , r . height / 2 ) , r . width / 2 ) # init () def move ( self , x , y ): self . rect . move_ip ( x , y ) # move ( )
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
# Configuraes i n i c i a i s co pygame . init () tela = pygame . display . set_mode ( ( 640 , 480 ) ) grupo = RenderUpdates () bola = Bola ( ( 0 , 0 ) , grupo ) clock = pygame . time . Clock () fundo = pygame . Surface ( tela . get_size () ) fundo . fill ( ( 0 , 0 , 255 ) ) tela . blit ( fundo , ( 0 , 0 ) ) pygame . display . flip () key = { K_UP : False , K_DOWN : False , K_LEFT : False , K_RIGHT : False }
# La o p r i n c i p a l c while True : clock . tick ( 24 ) # Trata e v e n t o s for e in pygame . event . get ( [ KEYUP , KEYDOWN ] ): valor = ( e . type == KEYDOWN ) if e . key == K_ESCAPE : raise SystemExit , " Fim . " elif e . key in key . keys (): key [ e . key ] = valor # Movimenta a b o l a de a c o r d o com a s t e c l a s if key [ K_UP ]: bola . move ( 0 , -10 ) if key [ K_DOWN ]: bola . move ( 0 , 10 ) if key [ K_LEFT ]: bola . move ( -10 , 0 ) if key [ K_RIGHT ]: bola . move ( 10 , 0 ) grupo . clear ( tela , fundo ) pygame . display . update ( grupo . draw ( tela ) )
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
Detectando colises o
Um dos recursos mais utilizados no desenvolvimento de jogos e detectar colises e o PyGame torna esta tarefa fcil com as o a funes: co spritecollide( sprite, grupo, mate ) detecta a coliso do Sprite com a os elementos do grupo. Caso mate for verdadeira executa o mtodo kill() dos sprites que colidiram. e Esta funo retorna uma lista com os elementos ca afetados. groupcollide( grupo1, grupo2, mate1, mate2 ) detecta a coliso a dos Sprites do grupo1 contra os do grupo2 e executa o mtodo kill() nos elementos baseado nos valores e dos parmetros mate1 e mate2. Esta funo retorna a ca um dicionrio no qual as chaves so elementos do a a grupo1 e os valores so listas de elementos do grupo2 a com os quais eles colidiram.
Gustavo Sverzut Barbieri Programao de Jogos em Python ca
Tutorial e Exemplos
Em http://www.gustavobarbieri.com.br/jogos/ existem alguns cdigos de jogos simples porm funcionais que o e podem ser utilizados como base de novos projetos. O tutorial passo a passo de como planejar e construir um jogo pode ser encontrado em: http://www.gustavobarbieri.com.br/jogos/jogo/doc/. Ele aborda como separar os elementos do jogo e com isso conseguir uma plataforma fcil de manter e extender. a
Referncias e
Python: http://www.python.org/ PyGame: http://www.pygame.org/ A Newbie Guide to pygame: http://www.pygame.org/docs/tut/newbieguide.html Introduo ao Pygame: ca http://www.pygame.org/docs/tut/intro/intro.html Dicas de Performance para Python: http: //www.python.org/moin/PythonSpeed/PerformanceTips Introduo ao Mdulo Sprite do PyGame: ca o http://www.pygame.org/docs/tut/SpriteIntro.html
Contato