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

Postagens mais visitadas deste blog

O poder que o priquito tem

Lógica em Naruto parte 1