Entendendo eventos

O allegro 5 introduziu o uso de eventos. Eventos são coisa que acontecem no programa desde cliques e movimentos do mouse, teclas serem pressionadas, um temporizador disparou, dentre outras coisas.

Caso o allegro não tivesse suporte a eventos, teríamos que verificar quando cada uma destas coisas acontecessem no programa em determinados espaços de tempo, e esta tarefa deixaria é demandante para o processador.

Para lidar com eventos, usamos uma fila de eventos. Cada vez que um evento acontece, ele é colocado na fila. Então quando o programa verificar se existe algum evento a ser tratado, removemos da fila o evento mais antigo e tratamos ele.

No exemplo abaixo, iremos criar um evento que permite tratar o que acontece ao clicar no botão X que fecha a janela. Analisemos o código:


			
			

ALLEGRO_EVENT_QUEUE

Na linha 20 criamos a variável que será usada como a fila de eventos, explicada anteriormente. Toda vez que um evento for disparado, ele será guardado nesta fila. E toda vez que quisermos remover um evento da fila (para resolver ele), sempre será removido o evento que está aguardando a mais tempo, como numa fila de pessoas esperando por atendimento.

al_create_event_queue()

Na linha 52 chamamos a função al_create_event_queue(), que cria uma fila de eventos vazia. A fila é atribuída á variável fila_eventos. Em caso de falha retorna NULL. O caso de falha está sendo verificado na linha 54.

51-61

al_register_event_source()

Na linha 61 chamamos a função al_register_event_source() que serve para ligar uma fonte de eventos à fila de eventos criada. Sem isto, por mais que os eventos ocorressem, o programa não iria colocá-los na fila. A função recebe por parâmetro a fila de eventos e a fonte dos eventos. Como queremos que a nossa fonte de eventos seja a janela, então chamamos a função al_get_display_event_source(), que retorna a fonte de eventos da janela passada por parâmetro.

A seguir desenhamos a imagem na janela (linha 64) e atualizamos a tela (linha 67).

69-85

O while acima é onde futuramente ficará toda lógica dos jogos que criaremos. Todo jogo se baseia em atualizar a tela em um intervalo de tempo predeterminado (idealmente 60 vezes por segundo, ou 60 fps), além de capturar entrada do usuário (por teclado, mouse, ou outros) e executar a lógica específica do jogo. Este processo acontece repetidamente até que o jogo termine. Neste nosso tutorial que trata de eventos, iremos utilizar o while para ficar "escutando" o evento do clique do X da janela.

ALLEGRO_EVENT

Na linha 71 criamos uma variável que irá guardar um evento. Basicamente pegaremos um evento da fila (quando um estiver disponível) e colocamos ele na variável evento. As variáveis ALLEGRO_EVENT são structs, cujo campo type indica o tipo de evento que foi disparado. Consulte a referência para a lista completa de tipos de eventos possíveis.

al_wait_for_event()

Na linha 73 chamamos a função al_wait_for_event(), que remove o primeiro item da fila de eventos e coloca na variável evento.

Na linha 76 verificamos se o tipo do evento (campo type da variável ALLEGRO_EVENT) disparado foi ALLEGRO_EVENT_DISPLAY_CLOSE. Em caso afirmativo, significa que o usuário clicou no botão para fechar a janela.

Na linha 77 mostramos uma mensagem perguntando se o usuário deseja fechar o programa. Caso o botão Sim seja clicando, o break na linha 80 fará com que o while encerre.

Ao fim do programa, nas linhas 88 e 89, os espaços de memória para a janela e fila de eventos são liberados.

Outros links