Tutorial de SDL- Parte 3 – Programação direcionada à Eventos

Continuando o tutorial sobre SDL publicado originalmente no site lazyfoo, iremos ver agora como tratar os eventos disparados pelo usuário.

Além de exibir imagens na tela, jogos precisam que você trate os eventos disparados pelo usuário. Você pode fazer isso com SDL usando o sistema de tratamento de eventos.

            //Main loop flag
            bool quit = false;

            //Event handler
            SDL_Event e;

Em nosso código, depois da inicialização do SDL e do carregamento dos arquivos de mídia (como mencionado no artigo anterior), declaramos um sinalizador de saída que registra se o usuário saiu do programa ou não. Como acabamos de iniciar a aplicação, obviamente inicializamos esta variável com o valor false.

Também declaramos uma variável SDL_Event, que representa qualquer tipo de coisa como um pressionamento de tecla, movimento do mouse, pressionamento de um botão no joystick, etc. No nosso exemplo iremos monitorar eventos de saída para encerrar a aplicação.

            //While application is running
            while( !quit )
            {

Nos artigos anteriores, fizemos o programa esperar por alguns segundos antes de ser fechado. Agora iremos fazer a aplicação esperar por um comando de fechar do usuário.

Dessa forma, a aplicação ficará em loop enquanto o usuário não der o comando de fechar. Esse loop que fica em execução enquanto a aplicação está ativa é chamado de main loop, e é chamado algumas vezes de game loop. É o núcleo de qualquer jogo.

                //Handle events on queue
                while( SDL_PollEvent( &e ) != 0 )
                {
                    //User requests quit
                    if( e.type == SDL_QUIT )
                    {
                        quit = true;
                    }
                }

Na parte superior de nosso main loop temos o loop de eventos. Ele fica processando a fila de eventos até que se esvazie.

Quando você pressiona um tecla, move o mouse, ou toca a tela você insere eventos na filha de eventos.

enqueue

A fila de eventos então armazenará esses eventos na ordem que eles ocorreram e ficam esperando você processa-los. Quando você quiser saber quais eventos ocorreram para processa-los, você solicita o evento mais recente da fila chamando SDL_PollEvent. O que essa função faz é pegar o evento mais recente da fila de eventos e colocar os dados na variável SDL_Event que passamos como parâmetro para a função.

dequeue

SDL_PollEvent irá continuar pegando eventos da fila até que ela fique vazia. Quando isso acontecer, SDL_PollEvent irá retornar 0. Então, o que o código acima faz é ficar tirando eventos da fila até ela se esvaziar. Se um evento da fila for um SDL_QUIT (que é o evento disparado quando o usuário clica no X da janela), ajustamos o sinalizador de saída para true e podemos encerrar a aplicação.

                //Apply the image
                SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );

                //Update the surface
                SDL_UpdateWindowSurface( gWindow );
            }

Depois que terminamos de processar os eventos para nosso frame, desenhamos a tela e atualizamos (como discutido no artigo anterior). Se o sinalizador de saída estiver com o valor true, a aplicação será encerrada no final do loop, Se for false ela irá continuar até o usuário clicar no X na janela.
Baixe os arquivos de imagem e o código fonte para esse artigo aqui.