Jika biasanya kita menggunakan SDL_RenderCopy untuk menampilkan gambar yang tersimpan dalam bentuk texture, kali ini kita akan menggunakan SDL_RenderCopyEx. Dengan SDL_RenderCopyEx, kita bisa menambahkan rotasi dan pencerminan saat kita menampilkan gambar. Gambar bisa diputar berdasarkan titik putar tertentu. Tapi, satu yang perlu diingat, jangan gunakan viewport!
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
int main(int argc, char* args[]){
SDL_Window* window = NULL;
SDL_Event evt;
int tmp1, tmp2, pos=0;
double rotasi=180;
SDL_RendererFlip cermin=SDL_FLIP_NONE;
SDL_Point titik_putar={0, 0};
if( SDL_Init( SDL_INIT_VIDEO ) < 0 && IMG_Init(IMG_INIT_JPG|IMG_INIT_PNG)){
printf( "Error: %s\n", SDL_GetError() );
}else{
window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
if( window == NULL ){
printf( "Error : %s", SDL_GetError() );
}else{
SDL_Renderer *trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_Surface *tmp=IMG_Load("Codelogi.png");
if(tmp){
int panjang=tmp->w;
int tinggi=tmp->h;
titik_putar.x=panjang/2;
titik_putar.y=tinggi/2;
SDL_SetColorKey(tmp, SDL_TRUE, SDL_MapRGB(tmp->format, 0x00, 0xFF, 0xFF));
SDL_Texture *bmp=SDL_CreateTextureFromSurface(trender, tmp);
SDL_FreeSurface(tmp);
if(bmp){
SDL_Rect rct, rcd;
rct.x=0;
rct.y=0;
rct.w=panjang;
rct.h=tinggi;
while(evt.type!=SDL_QUIT){
while(SDL_PollEvent(&evt)){
if(evt.type==SDL_KEYUP){
switch(evt.key.keysym.sym){
case SDLK_q:
if(cermin!=SDL_FLIP_NONE)cermin=SDL_FLIP_NONE;
else cermin=SDL_FLIP_VERTICAL;
break;
case SDLK_w:
if(cermin!=SDL_FLIP_NONE)cermin=SDL_FLIP_NONE;
else{
tmp1=SDL_FLIP_HORIZONTAL;
tmp2=SDL_FLIP_VERTICAL;
cermin=(SDL_RendererFlip)(tmp1|tmp2);
}
break;
case SDLK_e:
if(cermin!=SDL_FLIP_NONE)cermin=SDL_FLIP_NONE;
else cermin=SDL_FLIP_HORIZONTAL;
break;
case SDLK_a:
rotasi-=30;
if(rotasi<0)rotasi=330;
break;
case SDLK_s:
rotasi+=30;
if(rotasi>=360)rotasi=30;
break;
default:
cermin=SDL_FLIP_NONE;
rotasi=0;
}
}
}
SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(trender);
rcd.x=0;
rcd.y=0;
rcd.w=panjang;
rcd.h=tinggi;
rct.x=panjang*(pos/4);
SDL_RenderCopyEx(trender, bmp, NULL, &rcd, rotasi, &titik_putar, cermin);
SDL_RenderPresent(trender);
}
}
}
}
}
SDL_DestroyWindow( window );
SDL_Quit();
return 0;
}
Perbedaan dari SDL_RenderCopy dan SDL_RenderCopyEx adalah pada 3 parameter tambahan yang berada di posisi akhir. Tiga parameter tersebut mewakili rotasi, titik putar, dan pencerminan.
- int SDL_RenderCopyEx(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect, const double sudut, const SDL_Point* pusat, const SDL_RendererFlip flip);
- int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect);