Olá pessoal! Estou de volta com uma nova lição para você! E se de repente você se cansar de esperar uma lição minha, sempre poderá encontrar essas lições em inglês
aqui .
Bem, vamos começar a sétima lição com o título
A viewport é traduzida do inglês como um local de visualização ou, no nosso caso, é um local de renderização. A essência é esta: pegamos e limitamos a superfície do desenho não a toda a janela, mas a alguma parte dela. Isso pode ser útil, por exemplo, para desenhar um minimapa em um jogo.
Segundo a teoria, eu tenho tudo, nos voltamos para a prática.
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; const int SCREEN_SIZE[2] = {640, 480}; SDL_Window *window = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL;
Para iniciantes, como sempre declarando variáveis.
Vamos desenhar esta flor.
init bool init() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; return false; } int flags = IMG_INIT_PNG; if (!(IMG_Init(flags)&flags)) { cout << "Can't init IMG: " << IMG_GetError() << endl; return false; } window = SDL_CreateWindow("VIEWPORT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_SIZE[0], SCREEN_SIZE[1], SDL_WINDOW_SHOWN); if (window == NULL) { cout << "Can't create window: " << SDL_GetError() <<endl; return false; } ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() <<endl; return false; } return true; }
carregar bool load() { SDL_Surface *temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; return false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; SDL_FreeSurface(temp_surf); temp_surf = NULL; return false; } return true; }
desistir void quit() { SDL_DestroyWindow(window); window = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); }
Não descreverei as funções de inicialização, carregamento de imagem e desinicialização, pois são quase idênticas às anteriores.
E agora a parte divertida:
int main() { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } SDL_Rect top_vp = {0, 0, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2}; SDL_Rect bottom_vp = {0, SCREEN_SIZE[1] / 2, SCREEN_SIZE[0], SCREEN_SIZE[1] / 2};
Aqui, conectamos um
SDL , carregamos uma imagem e criamos dois retângulos que estão um abaixo do outro e ocupam toda a largura da janela. Essas são as nossas
janelas de exibição .
SDL_RenderSetViewport(ren, &top_vp); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderSetViewport(ren, &bottom_vp); SDL_RenderCopy(ren, flower, NULL, NULL);
Em seguida, já estamos começando a desenhar. Primeiro de tudo, precisamos estabelecer o local do desenho. Isso é feito pela função
SDL_RenderSetViewport , que aceita dois parâmetros: uma renderização e um retângulo nos quais gostaríamos de desenhar. Depois de definir a área, desenhe nossa flor nela com o conhecido método
SDL_RenderCopy . Depois disso, repita o mesmo para o segundo retângulo.
SDL_RenderPresent(ren); SDL_Delay(2000); quit(); return 0; }
Depois atualizamos a janela, esperamos 2 segundos e finalizamos o programa.
Após compilar e executar este programa, veremos duas flores achatadas. Isso é tudo que eu queria mostrar hoje.
Bem, aqui está uma lição tão pequena que, se você tiver alguma dúvida, ficarei feliz em explicar, mas tenho tudo. Tchau!
<< Lição anterior