Neste artigo da série irei mostrar brevemente o que são eventos e como funciona o tratamento deles no SDL, modificando nosso Hello World para ser finalizado caso o usuário aperte ESC ou clique no botão de fechar(aquele no canto superior direito da janela).
Vamos começar.
O que é um evento?
Eventos são ações que o usuário executa para interagir com o programa.
Como exemplos podemos citar clicar/mover com o mouse, apertar/soltar uma tecla, mexer num joystick, etc.. Existem diversos eventos diferentes.
Uma lista completa dos eventos tratados pela SDL pode ser encontrada na parte de eventos de sua documentação.
A SDL nos dê várias ferramentas para tratar eventos. Uma delas é a estrutura SDL_Event, uma das mais importantes na SDL. Ela é usada principalmente para ler os eventos que estão na fila da SDL, mas também pode ser usada para colocar eventos nessa fila, normalmente para simular um evento feito pelo usuário.
A estrutura dela é bem simples, sua definição é:
typedef union{ Uint8 type; //Tipo de evento SDL_ActiveEvent active; //Janela ganha/perde foco SDL_KeyboardEvent key; //Evento do teclado SDL_MouseMotionEvent motion; //Movimento do mouse SDL_MouseButtonEvent button; //Clique do mouse SDL_JoyAxisEvent jaxis; //Movimento da axis do joystick SDL_JoyBallEvent jball; //Movimento da trackball do joystick SDL_JoyHatEvent jhat; //Movimento da hat do joystick SDL_JoyButtonEvent jbutton; //Botões do joystick SDL_ResizeEvent resize; //Evento de redimensionamento da janela SDL_QuitEvent quit; //Evento para fechar a janela SDL_UserEvent user; //Evento definido pelo usuário SDL_SywWMEvent syswm; //Eventos especÃficos da plataforma, que não são tratados pela SDL } SDL_Event;
Conhecendo esta estrutura, fica fácil ler os eventos.
Vamos começar a modificar o código do nosso Hello World.
Como o código já foi explicado em um artigo anterior, só vou mostrar as partes que mudaram.
17 18 | //Variável que guarda a estrutura dos eventos da SDL SDL_Event evento; |
Aqui declaramos nosso SDL_Event, que irá guardar as informações dos eventos para tratarmos.
94 95 96 97 98 | //InÃcio do main int main (int argc, char* args[]) { //Variável que irá controlar se o usuário quer finalizar o programa bool sair = false; |
Como precisamos saber quando o usuário quer sair, declaramos a variável booleana sair que irá controlar a saÃda do loop principal do programa.
111 112 113 114 115 | //Loop principal while (!sair) //Enquanto o usuário não quiser sair... { //Enquanto houver um evento na fila para tratar while (SDL_PollEvent(&evento)){ |
No nosso loop principal, enquanto a variável sair for false, atualizamos os eventos chamando o método SDL_PollEvent, que joga os eventos novos em um SDL_Event passado como parâmetro. Usamos ele dentro de um while pois pode haver mais de um evento a ser tratado, e queremos tratar todos.
116 117 118 119 120 121 | //Se o evento for SDL_QUIT ou se for SDL_KEYDOWN(tecla pressionada) e a tecla for ESC... if ((evento.type == SDL_QUIT) | ((evento.type == SDL_KEYDOWN) && (evento.key.keysym.sym == SDLK_ESCAPE))) //Seta a variável sair para true, fazendo com que, na próxima iteração //do while mais externo, ele saia do loop sair = true; } |
Testamos nosso SDL_Event evento. Caso o tipo dela seja SDL_QUIT, ou seja, o usuário apertou o botão de sair(o do canto superior direito), ou se o evento for do tipo SDL_KEYDOWN, ele pressionou alguma teclado teclado, e essa tecla for ESC, nós setamos sair para true, para que, na próxima iteração a condição do while não seja satisfeita para sairmos desse loop.
122 123 124 | //Pausa o programa para evitar o consumo excessivo da CPU SDL_Delay(50); } |
Aqui a cada iteração do while nós damos um delay de 50ms para evitar que nosso programa consuma muitos recursos da CPU.
125 126 127 128 129 130 | //Libera os recursos e destrói a SDL quit(); //Termina a execução return 0; } |
Após o while nós executamos as funções para destruir a SDL e liberar as superfÃcies utilizadas e paramos a execução do programa.
Nesta versão do Hello World eu organizei um pouco, colocando toda a inicialização na função init() e a finalização em quit() mas, fora isto, o código é o mesmo.
Pronto, compile o código e teste.
Há muito mais a se falar sobre tratamento de eventos, porém o que mostrei neste artigo já é suficiente para grande parte dos casos.
No próximo artigo irei ensinar como instalar bibliotecas que aumentam as capacidades da SDL. Iremos instalar a SDL_gfx e irei dar um exemplo de como desenhar figuras geométricas na tela, que vamos usar no nosso Pong.
Até lá você pode ler a documentação da SDL e/ou também esta, que achei melhor até que a oficial.
Bons estudos e até a próxima.
Baixe os fontes e a imagem deste tutorial aqui.
Posts relacionados:
1 comment so far ↓
Muito bom o post cara! Continue assim! Só peço que não pare pelo caminho como muitos tutoriais na net xP.
Leave a Comment