As imagens utilizadas nos exemplos são essas abaixo:
#include <stdio.h> #include <SDL2/SDL.h> int main(int argc,char* argv[]){ if(SDL_Init(SDL_INIT_VIDEO) != 0){ fprintf(stderr, "Erro ao iniciar a biblioteca: %s", SDL_GetError()); return 1; } SDL_Window* janela; janela = SDL_CreateWindow("janela", 100, 100, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE ); if(janela == NULL){ fprintf(stderr, "Erro ao 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()); } // Imagem 1 SDL_Surface* green = SDL_LoadBMP("green.bmp"); if(green == NULL){ printf("Não foi possivel carregar a imagem"); } // Imagem 2 SDL_Surface* red = SDL_LoadBMP("red.bmp"); if(red == NULL){ printf("Não foi possivel carregar a imagem"); } // Imagem 3 SDL_Surface* blue = SDL_LoadBMP("blue.bmp"); if(blue == NULL){ printf("Não foi possivel carregar a imagem"); } SDL_Texture* tex = SDL_CreateTextureFromSurface(render, green); SDL_Rect* rec = new(SDL_Rect); rec->x = 0; rec->y = 0; rec->w = 100; rec->h = 100; SDL_Event event; bool quit = false; while(!quit){ SDL_PollEvent(&event); if(event.type == SDL_WINDOWEVENT){ switch(event.window.event){ case SDL_WINDOWEVENT_CLOSE: SDL_Log("Fechando o programa."); quit = true; break; case SDL_WINDOWEVENT_SIZE_CHANGED: SDL_Log("Maximizado para %d de largura e %d de altura", event.window.data1, event.window.data2); break; case SDL_WINDOWEVENT_MINIMIZED: SDL_Log("O programa foi minimizado!"); break; } } else if(event.type == SDL_KEYDOWN){ switch(event.key.keysym.sym){ case SDLK_a: rec->x--; break; case SDLK_s: rec->y++; break; case SDLK_d: rec->x++; break; case SDLK_w: rec->y--; break; case SDLK_1: tex = SDL_CreateTextureFromSurface(render, green); break; case SDLK_2: tex = SDL_CreateTextureFromSurface(render, red); break; case SDLK_3: tex = SDL_CreateTextureFromSurface(render, blue); break; } SDL_RenderClear(render); SDL_RenderCopy(render, tex, NULL, rec); SDL_RenderPresent(render); } SDL_FreeSurface(red); SDL_FreeSurface(green); SDL_FreeSurface(blue); SDL_DestroyTexture(tex); SDL_DestroyRenderer(render); SDL_DestroyWindow(janela); SDL_Quit(); return 0; }
O primeiro passo, depois de iniciar a biblioteca, foi carregar as imagens para a memória e testar se elas foram realmente carregadas assim como já fizemos em tutoriais anteriores.
// Imagem 1 SDL_Surface* green = SDL_LoadBMP("green.bmp"); if(green == NULL){ printf("Não foi possivel carregar a imagem"); } // Imagem 2 SDL_Surface* red = SDL_LoadBMP("red.bmp"); if(red == NULL){ printf("Não foi possivel carregar a imagem"); } // Imagem 3 SDL_Surface* blue = SDL_LoadBMP("blue.bmp"); if(blue == NULL){ printf("Não foi possivel carregar a imagem"); }
Nesta parte do código carregamos para a textura a imagem que queremos desenhar na tela. Uma das imagens tem que ser escolhida pois se a variável tex não for iniciada corretamente ou tiver um valor nulo ocorrerá um erro ao tentar desenhar a imagem na tela.
SDL_Texture* tex = SDL_CreateTextureFromSurface(render, green);
É necessário criar uma variável do tipo SDL_Rect, ela será usada para guardar dados da posição e tamanho da imagem que será desenhada na tela mais para frente no código.
Os valores de rec->x e rec->y, no código, definem a posição da imagem enquanto os valores de rec->w e rec->h definem o tamanho da imagem, quando a variável é usada como terceiro argumento na função SDL_RenderCopy().
Os valores de rec->x e rec->y, no código, definem a posição da imagem enquanto os valores de rec->w e rec->h definem o tamanho da imagem, quando a variável é usada como terceiro argumento na função SDL_RenderCopy().
SDL_Rect* rec = new(SDL_Rect); rec->x = 0; rec->y = 0; rec->w = 100; rec->h = 100;
O mesmo bloco while que é usado no tutorial anterior é também usado neste porem com o acréscimo do bloco de código para manipular o evento de teclado logo em seguida ao usado para manipular os eventos de janela.
Existem dois tipos de evento de teclado: o SDL_KEYDOWN, que ocorre ao pressionar uma tecla e o SDL_KEYUP, que ocorre ao pressionar e soltar uma tecla. Neste último caso ao soltar a tecla o tipo de evento vai continuar sendo SDL_KEYUP até se pressionar outra tecla e a ação que você programou para acontecer ao soltar a tecla irá continuar acontecendo até outra tecla ser pressionada. Teste no seu código, troque SDL_KEYDOWN por SDL_KEYUP e veja o que acontece.
No bloco de código abaixo é testado se o tipo de evento é SDL_KEYDOWN e se sim verifica através do bloco switch se o atributo key.keysym.sym da variável de manipulação de eventos, que para nós é a variável event corresponde a um dos valores.
Caso seja pressionada a tecla “a” (SDLK_a) a variável que é usada para definir a posição X (rec->x) da imagem e decrescida, com isso a imagem se desloca para a esquerda (tecla “s” para baixo, “d” para direita e “w” para cima ).
As teclas “1”, “2” e “3” do teclado, não as do teclado numérico, são usadas para trocar a imagem que é exibida na tela.
Podemos usar tanto as constantes definidas na biblioteca SDL (SDLK_a, SDLK_s, ...) quanto os caracteres entre aspas simples (‘a’, ‘s’).
Uma relação de todas as constantes podem ser vistas neste link:
else if(event.type == SDL_KEYDOWN){ switch(event.key.keysym.sym){ case SDLK_a: rec->x--; break; case SDLK_s: rec->y++; break; case SDLK_d: rec->x++; break; case SDLK_w: rec->y--; break; case SDLK_1: tex = SDL_CreateTextureFromSurface(render, green); break; case SDLK_2: tex = SDL_CreateTextureFromSurface(render, red); break; case SDLK_3: tex = SDL_CreateTextureFromSurface(render, blue); break; }
Depois de testar os eventos é hora de limpar a tela, jogar a imagem na tela e mostrar ela na tela.
SDL_RenderClear(render); SDL_RenderCopy(render, tex, NULL, rec); SDL_RenderPresent(render);
Na hora de finalizar nosso programa não podemos esquecer de descarregar as imagens que foram carregadas para a memória, destruir a textura e a área de renderização.
SDL_FreeSurface(red); SDL_FreeSurface(green); SDL_FreeSurface(blue); SDL_DestroyTexture(tex); SDL_DestroyRenderer(render);
Abaixo está um pequeno vídeo que fiz do funcionamento do programa.
Espero que tenha gostado do tutorial. E como sempre se encontrar algum erro, tiver alguma sugestão, duvida ou se quiser só me elogiar mesmo ( :P ) é só deixar ai embaixo nos comentários.
Agradeço sua visita e... até a próxima!
Nenhum comentário:
Postar um comentário