Rotasi dan Pencerminan

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); 
Variabel yang digunakan sebagai pusat atau titik putaran harus bertipe SDL_Point. SDL point berisi koordinat x dan y yang bisa kalian atur sebelum digunakan dalam function. Pusat rotasi atau titik putar pada kode program di atas berada pada bagian tengah gambar.
Contoh kode program di atas menggunakan event keyboard. Jika kalian ingin melihat perubahannya, coba tekan q, w, e, a, dan s.