Lições do SDL 2: Lição 2 - Principal não de borracha

Olá pessoal! Esta é minha segunda lição sobre SDL 2. Ainda recebo informações daqui .

Bem-vindo à lição

Principal não de borracha


Na última lição, organizei tudo na função Main () , mas para programas grandes isso não é bom. É por isso que a oportunidade de escrever funções apareceu. Agora vamos usá-lo.

Começaremos a escrever código conectando um SDL e declarando várias variáveis ​​globais.

#include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; 

Aqui, fora da função Main () , declaramos objetos de janela ( vitória ), superfícies de tela ( scr ) e a imagem deste emoticon ( sorriso ).

Vamos escrever uma função para inicializar o SDL, criar uma janela e uma superfície para desenhar. É assim:

Init ()
 int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } 

Este código deve ser familiar para você da lição anterior. Aqui inicializamos o sistema de vídeo, criamos uma janela com o nome “Main is not rubber”, com coordenadas indefinidas e com as dimensões definidas anteriormente, e também obtivemos a superfície da janela, salvando-a em scr . Em caso de erro, esta função retornará 1, caso contrário, 0.

Agora você pode escrever uma função para baixar os arquivos de mídia necessários. Aqui está:

Load ()
 int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } 

Esta função é extremamente simples. Carregamos a imagem .bmp usando a função SDL_LoadBMP . Essa função pega o caminho para o arquivo de imagem (completo ou relativo) e retorna um objeto da classe SDL_Surface . Você também deve verificar a correção da execução: se houver problemas com o download (arquivo não encontrado, arquivo quebrado), a função SDL_LoadBMP retornará NULL .

Também escrevemos um programa para concluir a inscrição.

Sair ()
 void quit() { SDL_FreeSurface(smile); smile = NULL; SDL_DestroyWindow(win); SDL_Quit(); } 

Uma nova função SDL_FreeSurface apareceu aqui , que simplesmente limpa a superfície. Depois de definir a variável smile como NULL . Todas as outras funções foram discutidas na lição anterior.

É aí que a escrita das funções termina e podemos prosseguir para Main () .

Principal ()
 int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Aqui, chamamos primeiro a função init () , escrita anteriormente, depois a função load () , que também escrevemos antes. Em seguida, exiba smile in scr , usando a função SDL_BlitSurface . Essa função pega uma superfície para desenhar, um retângulo que deve ser cortado nessa superfície (isso é necessário para animação); se nada precisar ser cortado, NULL é transmitido, a superfície na qual o retângulo é desenhado, cujas coordenadas são usadas para desenhar. Se as coordenadas são zero, passamos NULL .

É hora de falar sobre as coordenadas. O SDL usa um sistema de coordenadas diferente, não aquele com o qual todos estão acostumados. Aqui, o ponto com coordenadas (0, 0) está no canto superior esquerdo. É importante considerar ao exibir para evitar situações desagradáveis.

Bem, isso foi divertido, continuamos. Em seguida, atualizamos a janela com uma função já familiar, congelamos o programa por 2 segundos, chamamos a função quit () que escrevemos e encerramos o programa. Na saída, temos um programa que exibe um sorriso frio por 2 segundos. O código inteiro fica assim:

 #include <SDL2/SDL.h> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Surface *scr = NULL; SDL_Surface *smile = NULL; int init() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { return 1; } win = SDL_CreateWindow("Main  ", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { return 1; } scr = SDL_GetWindowSurface(win); return 0; } int load() { smile = SDL_LoadBMP("smile.bmp"); if (smile == NULL) { return 1; } return 0; } void quit() { SDL_FreeSurface(smile); SDL_DestroyWindow(win); SDL_Quit(); } int main (int argc, char ** args) { if (init() == 1) { return 1; } if (load() == 1) { return 1; } SDL_BlitSurface(smile, NULL, scr, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); quit(); return 0; }; 

Espero que tudo esteja claro. Boa sorte a todos!

<< Lição anterior || Próxima lição >>

Source: https://habr.com/ru/post/pt454414/


All Articles