Adicionando interação#
Nossa etapa final da introdução será permitir que nosso usuário interaja com nosso jogo. Já sabemos
- criar uma estrutura de jogo básica
- desenhar imagens na tela
- escrever texto na tela
Em nossa função recebe_eventos também já recebemos o evento pygame.QUIT, que significa que o usuário clicou no botão de fechar de nossa janela. De fato, 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 tipopygame.MOUSEBUTTONUP. - toda tecla pressionada gera eventos similares
pygame.KEYDOWNe em seguidapygame.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
Exercise 1
Answer
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 primeira opção 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:
| 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 |
Exercise 2
Answer
Como vimos na tabela no texto acima, todo evento do tipo 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. Isso resulta na terceira opção como correta.
Nesta sequência de exercícios vamos produzir o seguinte "jogo":

Temos uma novidade em relação aos outros exercícios de introdução: precisamos saber onde está a nave atualmente para podermos movimentá-la para a direita ou esquerda. Ou seja, o jogo tem um estado que representa o que está acontecendo no jogo neste momento. Uma das partes importantes da função recebe_eventos é modificar o estado do jogo baseado nas ações do usuário.
Exercise 3
Exercise 4
Answer
Precisamos checar duas coisas:
- o evento recebido é um evento de tecla pressionada?
- se sim, a tecla pressionada é seta para direita?
As duas primeiras alternativas checam direto ev.key, porém esse atributo key ´so existe em eventos de teclado. Se o evento for de mouse, por exemplo, o código daria erro.
Agora falta só mexer no estado do jogo. As coordenadas de pygame crescem para a direita e para baixo. Ou seja, para mover a nave para direita precisamos somar em state['nave_x'].
Exercise 5