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
>>