quinta-feira, 20 de agosto de 2015

03 – SDL2 – Criando a primeira janela

Neste tutorial vou mostrar como criar uma janela e configurar suas propriedades de exibição. Mas primeiro você precisa saber que a SDL é dividida em subsistemas e estes, para serem usados, precisam ser iniciados. Por padrão os subsistemas Event Handling, File I/O e Threading são iniciados. Já os subsistemas Timer, Audio, Video, Joystick, Haptic, GameController e Events devem ser iniciados para que possam ser usados.


Um exemplo de janela básica é mostrada na figura acima, nela são identificados os elementos básicos de uma janela o botão de controle onde é exibido o ícone do programa, caso tenha algum configurado a barra de título e os botões de minimizar, maximizar e fechar a janela.

Vamos ao código de como criar a janela simples e as explicações.

#include <stdio.h> // Para a fprintf
#include <sdl2.h>


int main(int argc,char* argv[]){


    if(SDL_Init(SDL_INIT_VIDEO) !=0){
        fprintf(stderr, "\nImpossivel iniciar o video: %s\n", SDL_GetError());
        return 1;
    }

    SDL_Window* janela;
    janela = SDL_CreateWindow("Primeira janela", 100, 100, 320, 240, 0);
    if(janela == NULL){
        printf("Não foi possivel criar a janela: %s", SDL_GetError());
        return 1;
    }

    SDL_Delay(3000);

    SDL_DestroyWindow(janela);
    SDL_Quit();
    return 0;
}


No bloco de código abaixo é onde iniciamos o subsistema de Video com a função SDL_Init(); passando para ela o parâmetro SDL_INIT_VIDEO. Um bloco if é usado para testar o valor de retorno desta função que, em caso de erro, retorna um valor diferente de zero. Em caso de erro a função fprintf joga para a saída de erro a mensagem junto com o erro reportado pela função SDL_GetError().

if(SDL_Init(SDL_INIT_VIDEO) !=0){
 fprintf(stderr, "\n Impossivel iniciar o video: %s\n", SDL_GetError());
 return 1;
}

Os parâmetros que podem ser usados com a função SDL_Init() são listados abaixo e serão explicados nos próximos tutoriais.

SDL_INIT_TIMER, SDL_INIT_AUDIO, SDL_INIT_VIDEOSDL_INIT_JOYSTICK, SDL_INIT_HAPTIC, SDL_INIT_GAMECONTROLLER, SDL_INIT_EVENTS, SDL_INIT_EVERYTHING e SDL_INIT_NOPARACHUTE

Depois de verificado se é possível iniciar o vídeo é hora de criar a janela



SDL_Window* janela;
    janela = SDL_CreateWindow("Primeira janela", 100, 100, 320, 240, 0);
    if(janela == NULL){
        printf("Não foi possivel criar a janela: %s", SDL_GetError());
        return 1;
    }

Depois de definida uma variável ponteiro que vai guardar a estrutura da janela usa-se a função SDL_CreateWindow e passamos como parâmetros o nome que queremos dar a janela, posição inicial da janela na tela, o tamanho da janela e por ultimo flags que definem o tipo da janela. No exemplo acima vai ser criada uma janela com o nome “Primeira janela”, vai aparecer na posição 100, 100 do monitor e vai ter o tamanho de 320 de largura por 240 de altura. 


 
O último parâmetro passado para a função define algumas características da janela e são mostradas na lista abaixo:


SDL_WINDOW_FULLSCREEN → Faz com que programa seja executado em modo de tela cheia com a resolução passada para a função SDL_CreateWindow.

SDL_WINDOW_FULLSCREEN_DESKTOP → Faz com que programa seja executado em modo de tela cheia porém usando a resolução atual do monitor.

SDL_WINDOW_OPENGL → Faz com que possa ser usado OpenGL na janela, gráficos 3D.

SDL_WINDOW_HIDDEN → Faz com que a janela não seja visível.

SDL_WINDOW_BORDERLESS → Não é exibido as bordas da janela.

SDL_WINDOW_RESIZABLE → Faz a com que a opção de redimensionar a janela esteja disponível abilitando também o botão de maximizar a janela.

SDL_WINDOW_MINIMIZED → Essa opção faz a janela iniciar minimizada.

SDL_WINDOW_MAXIMIZED → Essa opção faz a janela iniciar maximizada.

SDL_WINDOW_INPUT_GRABBED → A janela criada fica com o foco.


Devido ao código simples usado para teste apenas algumas opções fazem, realmente, alguma modificação visível. São elas SDL_WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN_DESKTOP , SDL_WINDOW_HIDDEN, SDL_WINDOW_BORDERLESS.
Neste bloco também há um teste para que em caso de erro ao tentar se criar a janela uma mensagem é enviada para a janela do console.

SDL_Delay(3000);

Bom… Disse anteriormente que cada subsistema tem que ser iniciado para que possa ser usado. Porem, a função SDL_Delay() é uma das exceções. Ela faz parte do subsistema de timer, mas o mesmo não precisa ser iniciado para que ela possa ser utilizada.
Sua finalidade é dar um “atraso”, em milissegundos, na execução do programa. Como o tempo para criação e exibição da janela é preciso um atraso na execução do programa para que possa se ver a janela neste exemplo. Os três segundos dados pela função é o suficiente para vê-la. 

SDL_DestroyWindow(janela);
SDL_Quit();

Chegou a hora de finalizar o programa. Para isso é preciso destruir a janela criada com a função SDL_DestroyWindow(janela) em seguida finalizando a biblioteca SDL com SDL_Quit(). Certifique-se de sempre destruir a janela criada e finalizar a biblioteca.


Com o que foi mostrado acima já é possível seguir para os próximos tutoriais, porém existem outras funções muito para configuração da janela. Estas demais funções serão mostradas em um pequeno projeto que será feito ao final destes pequenos tutoriais.
Novamente, obrigado e qualquer dúvida e/ou sugestão é só deixar nos comentários.


Referencias


4 comentários:

  1. Se não destruímos a janela ou não finalizarmos a biblioteca, o que pode acontecer?

    ResponderExcluir
  2. Caso não seja destruída a janela recursos do sistema continuarão sendo utilizados. Para pequenos exemplos como estes não será perceptível, mas para grandes programas vai ser um problema.

    No caso de não finalizar a biblioteca e se por exemplo mudar a resolução da tela, esta não voltara para resolução que estava usando antes de executar o programa, pode travar o mouse, teclado. Tudo vai depender dos recursos da SDL que você estiver usando.

    ResponderExcluir