Apoio
 Grupo PET Computação UFCG
  Tales Pimentel
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
 Vantagens
  Portável
    (Windows, Linux, Mac OS, SymbianOS, Nokia)

                                  Mais de 1000
    Documentação                  projetos
    disponível no site            disponíveis
                                  no site
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
    >>>
Introdução
 Instalando
  Num SO Linux, é possível instalar com o seguinte
  comando
     sudo apt-get install python-pygame
Como funciona um jogo em Pygame ?

 Um “Hello World”
  exibindo uma imagem (p1_HelloWorld.py)
  exibindo um texto (p2_HelloWorld2.py)
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
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
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 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)
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.
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
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       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
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             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
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 bom!”, True, (255, 0, 0)),
                                                (200,
150))
Referências

 http://www.pygame.org/

 Beginning Game Development with Python and
 Pygame, Will McGugan – Apress 2007.

Minicurso pygame

  • 2.
    Apoio Grupo PETComputação UFCG Tales Pimentel
  • 3.
    Agenda Introdução a Pygame Comofunciona um jogo em Pygame? Eventos: mouse e teclado Principais módulos
  • 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.
  • 5.
    Introdução http://www.pygame.org
  • 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 umjogo em Pygame ? Um “Hello World” exibindo uma imagem (p1_HelloWorld.py) exibindo um texto (p2_HelloWorld2.py)
  • 10.
    Como funciona umjogo 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 umjogo em Pygame ? Capturando events (p4_bouncer.py) pygame.event.get() Retorna uma lista de eventos QUIT KEYDOWN KEYUP MOUSEBUTTONUP MOUSEBUTTONDOWN
  • 12.
    Como funciona umjogo 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çãodo 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 Paraque 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 mantervá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 paraos 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 pelainformaçã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 umreló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))
  • 37.
    Referências http://www.pygame.org/ BeginningGame Development with Python and Pygame, Will McGugan – Apress 2007.