Apoio Grupo PET Computação UFCG Tales Pimentel Piment el
Apoio Grupo PET Computação UFCG Tales Pimentel Piment el
Agenda Introdução a Pygame Como funciona um jogo em Pygame? Eventos: mouse e teclado Principais módulos
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.
Introdução
http://www.pygame.org
Introdução Portável (Windows, Linux, Mac OS, SymbianOS, Nokia) Documentação disponível no site
Mais de 1000 projetos disponíveis no site
Introdução 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 >>>
Introdução Num SO Linux, é possível instalar com o seguinte comando sudo apt-get install python-pygame
Como funciona um jogo em Pygame ?
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
Como funciona um jogo em Pygame ? Capturando events (p4_bouncer.py) pygame.event.get() Retorna uma lista de eventos QUIT KEYDOWN KEYUP MOUSEBUTTONUP MOUSEBUTTONDOWN
Como funciona um jogo em Pygame ? Utilizando events event.type event.key
Utilizando key, mouse key.get_pressed() mouse.get_pressed) mouse.get_pos()
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
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: ...
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
Algumas teclas K_ESCAPE K_RETURN K_BACKSPACE K_SPACE K_a, K_b, ..., K_z K_LEFT K_RIGHT K_UP K_DOWN K_0, K_1, ..., K_9 K_LSHIFT, K_RSHIFT K_LCTRL, K_RCTRL K_LALT, K_RALT
“Esc” Enter Backspace
Barra de espaço Teclas de A a Z Seta para esquerda Seta para direita Seta para cima Seta para baixo Teclas de 1 a 9 Shift esquerdo e direito “ctrl” esquerdo e direito “Alt” esquerdo e direito
Onde encontrar? Documentação do Pygame Mouse: http://www.pygame.org/docs/ref/mouse.html Teclado: http://www.pygame.org/docs/ref/key.html
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
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()
Image Para que os códigos anteriores funcionem corretamente, veja a organização dos arquivos:
programa.py images/ pedra.gif objetos/ garrafa.png
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”)
Image É possível, a partir de uma imagem, obter um (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)
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
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
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)])
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
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. (“sounds”+os.sep+”toc1.wav”) som_colisao = pygame.mixer.Sound …
if acontece a colisao: play(1) # inteiro é o numero de repetições som_colisao. som_colisao.set_volume(0.7) # 0 <= volume
<= 1.0
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
Sprite Módulo próprio para os objetos, personagens, e cenário do jogo Um Sprite é a forma usada para representar um item do jogo. Possui uma posição (na tela) e uma imagem As fuções do módulo sprite lidam com objetos Sprite() Pygame.sprite.Sprite() Sprite.rect Sprite.image
rect = (x, y)
image = pygame.surface
Sprite bola
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
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)
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
Time # Cria um relógio clock = pygame.time.Clock() …
x , y = (10, 5) vel_x, vel_y = 7, 3 …
While True: delta_tempo = clock.tick() …
x += vel_x * delta_tempo y += vel_y * delta_tempo
pygame.time.Clock() Cria um relógio que serve para obter a variação de tempo ao longo do programa Clock.tick() Retorna o tempo, em milisegundos, desde a última chamada deste método Uma vez por loop
# S = S0 + v * t
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” )
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 150))
bom!”,
True, (255, 0, 0)), \\ (200,