• Jogos
  • 04. Adicionando interação

Adicionando Interação

Outros eventos

Nossa etapa final da introdução será permitir que nosso usuário interaja com nosso jogo. Já sabemos:

  1. criar uma estrutura de jogo básica
  2. desenhar imagens na tela
  3. escrever texto na tela
  4. fechamos a janela quando o usuário clica no botão de fechar

Esse último ponto é feito na função recebe_eventos, quando o evento pygame.QUIT é recebido.

Na verdade, todas as interações do usuário com nosso jogo chegam via retorno da função pygame.event.get()! Vamos ver alguns exemplos:

  • quando o usuário aperta o botão esquerdo do mouse no nosso jogo recebemos um evento do tipo pygame.MOUSEBUTTONDOWN. Quando este botão é liberado é enviado um evento do tipo pygame.MOUSEBUTTONUP.
  • toda tecla do teclado ao ser pressionada gera eventos similares: pygame.KEYDOWN e, em seguida, pygame.KEYUP.
  • se a tela do jogo for redimensionada recebemos um evento do tipo pygame.VIDEORESIZE.

Note que os nomes dos eventos são bastante descritivos. Vamos agora olhar novamente a função recebe_eventos:

def recebe_eventos():
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            return False

    return True

Exercício 1

Levando em conta as informações acima, como você modificaria o código da função recebe_eventos para imprimir no terminal a mensagem "Apertou teclado!" quando o usuário pressionar uma tecla do teclado?

Resposta

O evento pygame.KEYDOWN é recebido quando a tecla é pressionada e, quando o usuário soltá-la o evento pygame.KEYUP é enviado para nosso programa. Note que existem vários tipos de eventos, então a opção com o else não é válida: ela mostra a mensagem em qualquer evento que não seja pygame.QUIT.

Agora vamos ver como extrair informações relevantes destes eventos. De acordo com o tipo do evento, a variável evento do código acima pode conter os seguintes atributos (uma lista mais completa de atributos pode ser encontrada na documentação):

Tipo do Evento Atributos
pygame.MOUSEBUTTONDOWN pos, button
pygame.MOUSEBUTTONUP pos, button
pygame.MOUSEMOTION pos, button, rel
pygame.KEYUP key, mod
pygame.KEYDOWN key, mod

A tabela acima indica que, se a variável evento for do tipo, pygame.KEYUP, por exemplo, você poderá acessar evento.key para descobrir qual tecla foi solta.

Exercício 2

Queremos detectar se o usuário pressionou a seta para a esquerda no nosso código. Qual linha abaixo contém a condição que usaríamos no código abaixo para fazer essa checagem?

def recebe_eventos():
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            return False
        elif evento.type == pygame.KEYDOWN:
            if __________ :
                print('Apertou seta para esquerda')

    return True

Para fazer essa questão será necessário ler a documentação de pygame.key.

Resposta

Como vimos na tabela no texto acima, todo evento do tipo pygame.KEYDOWN possui um atributo key contendo a tecla pressionada. A documentação mostra uma grande tabela com todas as teclas disponíveis como constantes começando com K_. Assim como os eventos, elas estão disponíveis como atributos de pygame.

Finalmente, precisamos checar se evento.key é igual à constante pygame.K_LEFT.

Vamos fazer uma breve pausa para reflexão.