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.KEYDOWN
e 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