• Jogos
  • 04. Adicionando interação

Adicionando Interação

Eventos vs. Input

Os eventos do teclado, a princípio, são muito parecidos com o input() que usamos no Python desde o começo do semestre. Entretanto, essa semelhança pode ser bastante enganosa. A documentação da função pygame.event.get() diz que ela "get events from the queue", mas o que é essa fila?

O Pygame é uma biblioteca de desenvolvimento de jogos, que, em sua grande maioria, possuem uma tela com imagens dinâmicas. Por esse motivo não seria interessante que os eventos do teclado se comportassem como o input(), que trava o programa enquanto o usuário não digita algo e aperta ENTER. A solução encontrada pelo Pygame (na verdade, da maioria dos programas interativos) é receber as interações do usuário em segundo plano. Toda vez que o usuário aperta ou solta uma tecla, é criado um evento e adicionado em uma fila (mais ou menos como uma lista do Python), mas o programa não para de rodar.

Quando o programa chama for evento in pygame.event.get(), o Pygame devolve e automaticamente remove os eventos que estão na fila. Assim, depois de concluir esse for não haverá mais nenhum evento na fila.

A seguir apresentamos uma pequena tabela com algumas diferenças entre o input() e os eventos do Pygame:

input() Eventos Pygame
Ao final da chamada sempre devolve um valor É possível que nenhum evento tenha ocorrido (usuário não pressionou nenhuma tecla)
Programa para até que o usuário digite algo Programa não espera por eventos

Exercício 1

Considere a seguinte sequência de acontecimentos:

1. Programa (jogo) inicia e começa a executar o game loop;
2. Jogador aperta a tecla W;
3. Jogador solta a tecla W;
4. Jogador aperta a tecla S;
5. Programa chama a função pygame.event.get() e processa os eventos;
6. Jogador solta a tecla S;
7. Jogador aperta a tecla D;
8. Programa chama a função pygame.event.get() e processa os eventos.

Quais serão todos os eventos presentes na fila quando o programa chama a função pygame.event.get() pela segunda vez (item 8)?

Resposta

Assim que são recebidos, os eventos são adicionados à fila de eventos. Assim, os eventos pygame.KEYDOWN e pygame.KEYUP da tecla pygame.K_w e pygame.KEYDOWN da tecla pygame.K_s são adicionados à fila. Depois da primeira chamada à função pygame.event.get(), esses 3 primeiros eventos já foram consumidos/tratados e são automaticamente removidos pelo Pygame.

Seguindo com os acontecimentos, os eventos pygame.KEYUP da tecla pygame.K_s e pygame.KEYDOWN da tecla pygame.K_d são recebidos e adicionados à fila. Quando a função pygame.event.get() é chamada novamente, apenas os 2 últimos eventos estarão presentes.

Agora que entendemos melhor como os eventos funcionam, vamos usar o teclado para controlar um jogador na tela.