Tutorial SDL – parte 3 – Eventos, uma pequena introdução
O que são eventos? Evento é tudo o que acontece (tá e daí?), ou seja, qualquer tecla que seja apertada, qualquer movimento do mouse, quando minimiza a janela, muda de tamanho ou arrasta, quando fecha a janela.
Nesse tutorial mostrarei apenas uma introdução aos eventos, pois precisaremos de mais conhecimentos em relação às carregamento de imagens para brincarmos com eventos e imagens, como, por exemplo, movimentar um personagem.
-
//O Cabeçalho
-
#include "SDL/SDL.h"
-
#include "SDL/SDL_image.h"
-
#include
-
//Atributos da Tela
-
const int SCREEN_WIDTH = 640;
-
const int SCREEN_HEIGHT = 480;
-
const int SCREEN_BPP = 32;
-
//As superfícies
-
SDL_Surface *imagem = NULL;
-
SDL_Surface *tela = NULL;
Esse cabeçalho acima não é novidade nenhuma né? Agora vem o novo...
-
//A estrutura que usaremos para capturarmos os eventos
-
SDL_Event evento;
-
-
SDL_Surface *carregaImagem( std::string imagem )
-
{
-
//Superfície que armazena temporariamente a imagem
-
SDL_Surface* imagemCarregada = NULL;
-
//Superfície que retorna a imagem otimizada
-
SDL_Surface* imagemOtimizada = NULL;
-
//Carrega a imagem
-
imagemCarregada = IMG_Load( imagem.c_str() );
-
//Verifica se tudo deu certinho
-
if( imagemCarregada != NULL )
-
{
-
//Cria a imagem otimizada
-
imagemOtimizada = SDL_DisplayFormat( imagemCarregada);
-
//Libera a imagem carregada
-
SDL_FreeSurface( imagemCarregada );
-
}
-
//Retorna a imagem otimizada
-
return imagemOtimizada;
-
}
-
-
void aplicaSuperficie( int x, int y, SDL_Surface* fonte, SDL_Surface* destino )
-
{
-
//Cria um retangulo para a superficie
-
SDL_Rect retangulo;
-
//Dá as coordenadas para o retangulo
-
retangulo.x = x;
-
retangulo.y = y;
-
//encaixa a "fonte" dentro do "destino" através do retangulo
-
SDL_BlitSurface( fonte, NULL, destino, &retangulo );
-
}
As funções de carregar e aplicar as imagens como já foi mostrada nos tutoriais anteriores
-
bool inicia()
-
{
-
//Inicia os subsistemas da SDL
-
if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
-
{
-
return false;
-
}
-
//Setando a tela
-
tela = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
-
//Verifica se existe algum erro na tela
-
if( tela == NULL )
-
{
-
return false;
-
}
-
//Setando o caption da janela
-
SDL_WM_SetCaption( "Tutorial SDL - Eventos", NULL );
-
//Se tudo deu certo
-
return true;
-
}
Função para iniciar a aplicação, seta a SDL, o caption e retorna true se der tudo certo.
-
bool carrega_arquivos()
-
{
-
//Carrega a imagem
-
imagem = carregaImagem( "x.jpg" );
-
//Verifica se existe algum erro no carregamento da imagem
-
if( imagem == NULL )
-
{
-
return false;
-
}
-
//se tudo der certo
-
return true;
-
}
Essa função carrega os arquivos (imagens) que queremos no nosso jogo.
-
void limpa()
-
{
-
//Libera a imagem
-
SDL_FreeSurface( imagem );
-
//Fecha a SDL
-
SDL_Quit();
-
}
Funcção usada para liberar a imagem e fechar a SDL. Agora vamos à função main:
-
int main( int argc, char* args[] )
-
{
-
//Variável necessária para saber se o usuário fechou a janela
-
bool quit = false;
Essa variável é usada para verificar se o usuário fechou a janela.
-
//Inicia
-
if( inicia() == false )
-
{
-
return 1;
-
}
-
//Carrega os arquivos
-
if( carrega_arquivos() == false )
-
{
-
return 1;
-
}
Chamando a inicialização e a função de carregamento de imagens.
-
//Aplicando as superfícies na tela
-
aplicaSuperficie( 0, 0, imagem, tela );
-
//Atualiza a tela
-
if( SDL_Flip( tela ) == -1 )
-
{
-
return 1;
-
}
Mostra a imgem na tela.
-
//Enquanto o usuário não fechar o programa
-
while( quit == false )
-
{
Começando o loop principal da aplicação.
-
//Quando ocorrer um evento
-
while( SDL_PollEvent( &evento ) )
-
{
Aqui usamos a função SDL_PollEvent. Ela espera por qualquer tipo de evento (clique e movimentação de mouse, quando alguma tecla do teclado é pressionada, etc), vou implementar quando o X da janela é apertado e assim, fecharemos o programa.
-
//se o usuário apertou o X da janela
-
if( evento.type == SDL_QUIT )
-
{
-
//Fecha o programa
-
quit = true;
-
}
-
}
-
}
Comparamos o tipo do evento (evento.type) e implementamos uma ação para quando esse evento ocorrer. Outros tipos de eventos disponíveis são: SDL_KEYDOWN, SDL_MOUSEMOTION, SDL_MOUSEBUTTONDOWN. Veja um exemplo aqui Com outros tipos de eventos (explicarei aqui em breve).
-
//Libera a superficie e fecha a SDL
-
limpa();
-
return 0;
-
}
Finalmente Fechamos o programa
Para mostrar esse tutorial, criei um arquivo jpg para carregar uma imagem na tela.
Para baixar o fonte clique aqui.
Algum tio de Dúvida? romulo@cubagames.com.br ou comentário no site!

