SDL - Ótimo para criação de jogos
A biblioteca SDL foi criada para facilitar a criação de jogos em Linux, *BSD, MacOS, Win32 e BeOS. Por ser uma biblioteca multi-plataforma, você terá um único código de seu jogo para diferentes sistemas operacionais. Neste artigo abordarei o básico sobre o uso dessa poderosa biblioteca.
Parte 2: Vídeo e gráficos
Vamos falar primeiramente sobre o vídeo, praticamente é para
isso que o SDL é usado. Todos os programas em SDL tem que usar
essa função de qualquer maneira.
Aqui vai um exemplo com comentários:
Aqui vai um exemplo com comentários:
/* Cria uma surface SDL */
SDL_Surface *screen;
/* Inicia o vídeo */
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
printf("Impossível iniciar SDL %s",SDL_GetError());
exit(-1);
}
/* Usando esta função não precisamos usar a SDL_Quit antes de
usar a função exit */*
atexit(SDL_Quit);
/* Aqui iremos iniciar o vídeo em resolução 640x480 com 16
bits-per-pixel, usando o Hardware */*
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
/* Caso ele não consiga usar este modo de vídeo */
if (screen == NULL) {
printf("Impossível trocar modo de vídeo. %s", SDL_GetError());
exit(-1);
}
SDL_Surface *screen;
/* Inicia o vídeo */
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
printf("Impossível iniciar SDL %s",SDL_GetError());
exit(-1);
}
/* Usando esta função não precisamos usar a SDL_Quit antes de
usar a função exit */*
atexit(SDL_Quit);
/* Aqui iremos iniciar o vídeo em resolução 640x480 com 16
bits-per-pixel, usando o Hardware */*
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
/* Caso ele não consiga usar este modo de vídeo */
if (screen == NULL) {
printf("Impossível trocar modo de vídeo. %s", SDL_GetError());
exit(-1);
}
Agora que iniciamos o vídeo, não queremos que a nossa janela fique vazia, né? Então vamos carregar um BMP e colocá-lo no vídeo usando uma função.
void mostrar_bmp(char *arquivo)
{
SDL_Surface *imagem;
/* Carrega o Bitmap na surface criada */
imagem = SDL_LoadBMP(arquivo);
if (imagem == NULL) {
printf("Impossível carregar o arquivo %s: %s", arquivo, SDL_GetError());
exit(-1);
}
/* Coloca a imagem na tela */
if (SDL_BlitSurface(imagem, NULL, screen, NULL) < 0) {
printf("Erro no BlitSurface: %s", SDL_GetError());
exit(-1);
}
/* Atualiza toda a tela */
SDL_UpdateRect(screen, 0,0,0,0);
/* Desaloca a imagem */
SDL_FreeSurface(imagem);
}
{
SDL_Surface *imagem;
/* Carrega o Bitmap na surface criada */
imagem = SDL_LoadBMP(arquivo);
if (imagem == NULL) {
printf("Impossível carregar o arquivo %s: %s", arquivo, SDL_GetError());
exit(-1);
}
/* Coloca a imagem na tela */
if (SDL_BlitSurface(imagem, NULL, screen, NULL) < 0) {
printf("Erro no BlitSurface: %s", SDL_GetError());
exit(-1);
}
/* Atualiza toda a tela */
SDL_UpdateRect(screen, 0,0,0,0);
/* Desaloca a imagem */
SDL_FreeSurface(imagem);
}
Excelente artigo. Acho que o SDL está para o Linux assim como o directX está para o Windows. É uma pena que não exista uma biblioteca compatível com o directX, isso facilitaria muito a portabilidade de aplicativos.
Não sei se você sabe me responder, mas é possível trabalhar com diversas "surfaces" com SDL, ou seja, utilizar o processo de blit em surfaces diferentes, para ganhar velocidade da mesma forma que se faz com o directX?
[]'s
Celso Goya
PS: Se aceita a sugestão, um tutorial sobre sprites e sdl cairía como uma luva. :-)