Continuando o tutorial anterior mostrarei como desenhar uma imagem em uma posição escolhida da tela e também como desenhar apenas parte da imagem na tela além de redimensionar a imagem final.
Para isto vamos contar com o código do tutorial anterior apenas acrescentando o necessário para que este funcione corretamente.
Vamos ao primeiro exemplo, posicionado e escalando a imagem:
#include <stdio.h> // Para a fprintf #include <SDL2/SDL.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, 800, 600, 0 | SDL_WINDOW_SHOWN); if(janela == NULL){ printf("Não foi possivel criar a janela: %s", SDL_GetError()); return 1; } SDL_Renderer* render = SDL_CreateRenderer(janela, -1, SDL_RENDERER_ACCELERATED); if(render == NULL){ printf("Erro ao criar o reder: %s", SDL_GetError()); } SDL_Surface* imagem = SDL_LoadBMP("circulos.bmp"); if(imagem == NULL){ printf("Não foi possivel carregar a imagem"); } SDL_Texture* textura = SDL_CreateTextureFromSurface(render, imagem); SDL_FreeSurface(imagem); SDL_RenderClear(render); SDL_Rect* dst_rect = new(SDL_Rect); dst_rect->x = 0; dst_rect->y = 0; dst_rect->w = 128; dst_rect->h = 128; SDL_RenderCopy(render, textura, NULL, dst_rect); SDL_RenderPresent(render); SDL_Delay(5000); SDL_DestroyTexture(textura); SDL_DestroyRenderer(render); SDL_DestroyWindow(janela); SDL_Quit(); return 0; }
Para este exemplo eu criei uma janela de tamanho maior 800x600 assim como mostra o bloco de código abaixo
SDL_Window* janela; janela = SDL_CreateWindow("Primeira janela", 100, 100, 800, 600, 0 | SDL_WINDOW_SHOWN); if(janela == NULL){ printf("Não foi possivel criar a janela: %s", SDL_GetError()); return 1; }
Lembram que no tutorial anterior falei que o terceiro e quatro parâmetro da função SDL_RenderCopy estavam relacionados com as coordenadas da imagem. Pois bem, o quarto parâmetro é o responsável pela posição e escala da imagem na tela.
Este parâmetro deve ser um ponteiro do tipo SLD_Rect, uma estrutura contendo 4 elementos: x, y, w e h.
Os elementos x e y são responsáveis por posicionar a imagem eu um local específico na tela, no nosso caso 0 em x e 0 em y. Já os elementos w e h são responsáveis pelo tamanho ocupado na tela, a escala da imagem, onde w se refere a largura e h a altura da imagem. Neste caso 128x128 corresponde a largura e altura originais da nossa imagem de teste, estes valores poderiam ser trocados por qualquer outro acima ou abaixo do valor original com a finalidade de deixar a imagem maior ou menor na tela.
SDL_Rect* dst_rect = new(SDL_Rect); dst_rect->x = 0; dst_rect->y = 0; dst_rect->w = 128; dst_rect->h = 128; SDL_RenderCopy(render, textura, NULL, dst_rect);
O resultado é o mostrado na figura abaixo:
O próximo exemplo mostra como desenhar apenas uma parte da imagem na tela. Para isto deve-se criar mais variável do tipo SDL_Rect que será passada para o parâmetro três da função SDL_RenderCopy, este argumento é o que controla a porção da imagem que queremos desenhar na tela. Vou mostrar primeiro uma ilustração da imagem que utilizarei.
Tal como no exemplo anterior os elementos x, y, w e h estão presentes, porém não se referem a posição na tela e escala da imagem, mas sim a posição inicial de corte e tamanho do retângulo a ser cortado
Por esta ilustração dá para saber qual os valores devemos passar para que se possa desenhar um dos círculos.
Por exemplo se quisermos que círculo vermelho seja exibido devemos passar para os elementos x e y os valores de onde o círculo começa na imagem, neste caso 64 em x e 0 em y. Para os elementos w e h passamos a altura e a largura do círculo, que em nosso exemplo podemos ver que é 64 de largura por 64 de altura.
SDL_Rect* src1_rect = new(SDL_Rect); src1_rect->x = 64; src1_rect->y = 0; src1_rect->w = 64; src1_rect->h = 64; SDL_Rect* dst1_rect = new(SDL_Rect); dst1_rect->x = 0; dst1_rect->y = 0; dst1_rect->w = 64; dst1_rect->h = 64; SDL_RenderCopy(render, textura, src1_rect, dst1_rect);
Outra coisa que difere do código anterior é que devemos passar, para o quarto parâmetro, a largura e altura do pedaço da imagem que queremos mostrar e não o tamanho total da imagem.
Como o tamanho do pedaço é 64 de largura por 64 de altura devemos passar estes valores se não quisermos que a imagem sofra uma escala e fique maior que o tamanho original.
Teremos, etão, na saída a tela abaixo:
Para este tutorial é só. Como sempre, se tiver alguma dúvida ou sugestão é só deixar nos comentários aí em baixo. Até o próximo.
Nenhum comentário:
Postar um comentário