Introdução ao tratamento de eventos na SDL

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. Configurando a SDL – Linux
  2. O que é a SDL?
  3. Configurando a SDL – Windows
  4. Instalando extensões para a SDL – Linux
  5. “Hello World!” na SDL

1 comment so far ↓

#1 Eu on 07.02.07 at 5:32 pm

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