Tutorial SDL2 em português - parte 1
Sobre o SDL2
SDL2 é uma API multiplataforma para criar jogos e aplicações multimídias.
Instalação do SDL2 (para Linux):
Para instalar o SDL2 no seu Linux rode o comando abaixo (para Ubuntu e derivados):
sudo apt-get install libsdl2-dev
Para instalar em outras plataformas consulte o tutorial:
SDL2 Installation
Iniciando e fechando o SDL (sistema de video)
Para iniciar o SDL usaremos a função SDL_Init, que carrega todas as funções do SDL para que possamos usá-las, veja o protótipo abaixo:
int SDL_Init ( Uint32 flags ) //protótipo da função
A função SDL_Init pode receber diversos parâmetros que servem para iniciar certos subsistemas, como video, timer, ou mesmo CDROM. No SDL2 existem esses sistemas básicos abaixo:
SDL_INIT_TIMER | inicia subsistema de timer
SDL_INIT_AUDIO | inicia subsistemas de audio
SDL_INIT_VIDEO | inicia subsistema de video (janelas), automaticamente inicia subsistema de eventos
SDL_INIT_JOYSTICK | inicia subsistema de joystick
SDL_INIT_HAPTIC | haptic (feedback de força/pressão sobre tela touchscreen)
SDL_INIT_GAMECONTROLLER | inicia o sistema de gamecontroller, inicia sozinho substema de joystick
SDL_INIT_EVENTS | inicia subsistema de eventos
SDL_INIT_EVERYTHING | inicia todos os subsistemas
SDL_INIT_NOPARACHUTE | ignnorado no SDL, é apenas para compatibilidade
A função SDL_Init retorna -1 em caso de erro e 0 em caso de sucesso. Veja um exemplo mínimo abaixo:
// compile o exemplo com: g++ -o sdl_init sdl_init.cpp -lSDL2
#include <cstdio>
#include <SDL2/SDL.h>
int main (int argc, char **argv)
{
// inicia o subsistema de video (para criar janelas)
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
//A função SDL_GetError() retorna um "char *" com a mensagem de erro se houver erro
printf("Erro: %s\n", SDL_GetError());
return 1;
}
// fecha todo o SDL
// NOTA: sempre chame esta função no final do código
SDL_Quit();
return 0;
}
Sempre se chama primeiro SDL_Init para iniciar o SDL e poder usar suas funções. No final do programa é preciso fechar o SDL para desalocar tudo que foi chamado para as funções, apenas use SDL_Quit() para fechar tudo.Criando uma janela
Criar uma janela no SDL2 é muito simples, basta você chamar a função SDL_CreateWindow com os parâmetros certos e ela retornará um ponteiro para uma janela (SDL_Window *).
Desta vez veremos como criar e liberar a memória de uma janela. A função que cria janelas no SDL é a SDL_CreateWindow. Quando ele é chamada, dependendo do parâmetro das flags usadas, a janela pode nem ser vista, fica apenas escondida mas criada.
Veja abaixo a declaração de CreateWindow:
SDL_Window * SDL_CreateWindow(const char * tituloDaJanela, int posicaoX, int posicaoY, int larguraJanela, int alturaJanela, Uint32 flags);
Onde:
const char * tituloDaJanela é o título que aparece na barra da jenela. Exemplo: "Este é um titulo"
int posicaoX é a posição X da janela dentro do desktop. O canto esquerdo superior do seu desktop é onde começa a contar e se a posicaoX for zero, sua janela vai aparecer grudada no lado esquerdo da tela.
int posicaoY é a posição Y da janela dentro do desktop. O canto esquerdo superior do seu desktop é onde começa a conta e se a posicaoY for zero, sua janela vai aparecer grudada na parte de cima do desktop.
int larguraJanela é a largura que a janela terá em pixels int alturaJanela é a altura que a janela terá em pixels.
Uint32 flags são as flags que indicam propriedades da janela, algo como SDL_WINDOW_SHOWN que é para a janela ser criada e mostrada logo em seguida na tela.
A função retorna um ponteiro para um SDL_Window ou NULL em caso de falha na criação da janela. Existem outras flags da função SDL_CreateWindow, você pode ver aqui: SDL_CreateWindow
Exemplo de uso:
//exemplo janela.cpp
//para compilar: g++ -o janela janela.cpp -lSDL2
#include
#include
int main(int argc, char* argv[])
{
// Inicia o SDL, nesse caso inicia o sistema de vídeo
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
//A função SDL_GetError() retorna um "char *" com a mensagem de erro se houver erro
printf("Erro: %s\n", SDL_GetError());
return 1;
}
// declara um ponteiro de janela
SDL_Window *janela;
// cria uma janela com título "Janela SDL2" na posição X=10 e Y=20, com tamanho 640x480
janela = SDL_CreateWindow("Janela SDL2",10,20, 640, 480, SDL_WINDOW_SHOWN);
//poderia criar uma janela com OpenGL:
//janela = SDL_CreateWindow("Janela SDL2",10,20, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
//verifica se deu erro na criação da janela
if (janela == NULL)
{
//A função SDL_GetError() retorna um "char *" com a mensagem de erro se houver erro
printf("Erro: %s\n", SDL_GetError());
return 1;
}
//nessa parte viria o loop principal e processamento de eventos
// mas aqui vamos esperar 3000 milissegundos, ou 3 segundos
// e então a janela vai fechar sozinha
// pausa o programa por 3000 milissegundos, ou 3 segundos
SDL_Delay(3000);
//lembre-se de liberar a memoria da janela com esta função abaixo
// ou você terá um memory leak
SDL_DestroyWindow(janela);
//E por fim, libere o SDL
SDL_Quit();
return 0;
}
A função SDL_Delay é usada para parar o programa por alguns milissegundos, no nosso caso eu coloquei 3000 ms (3 segundos) de espera. Experimente remover esta função e recompilar e executar de novo o programa para ver o que acontece.Observe que antes de fechar o SDL, devemos destruir a janela (no caso é liberar a memória da janela). Você sempre deve fazer isso caso não precise mais da janela criada. No caso basta apenas fazer:
...
SDL_DestroyWindow(janela);
...
Onde janela é um ponteiro do tipo SDL_Window.Chegou a hora dos exercícios, não podemos somente ver o código, temos que tocá-lo com o cérebro também, então faça isto:
-pegue o programa acima como base e faça o seguinte:
-crie uma janela com tamanho 340x240 na posição (0,0) com um título diferente, qualquer titulo.
-vá no link: SDL_CreateWindow, e então, pegue o programa acima e faça ele criar uma janela em fullscreen, dessas que se ver em jogos. Leia a doc das flags no link que te passei.
NOTA: não esqueça o SDL_Delay para pausar a execução por alguns milissegundos.
Se quiser, deixe um comentário ai em baixo no meu artigo que vou responder quando eu ver.
Depois que fizer os exercícios, avance para a próxima página
Até a próxima.
Comentários
Postar um comentário