Color Keying

Jika kita menggunakan gambar yang tidak memiliki bagian transparan, kita bisa menghilangkan salah satu warna pada gambar supaya menjadi bagian yang 100% transparan. Untuk mengatur bagian yang transparan "berdasarkan warna" kita bisa menggunakan SDL_SetColorKey pada variabel dengan tipe SDL_Surface.
  • int SDL_SetColorKey(SDL_Surface* surface, int flag, Uint32 key) 
Kalian bisa menentukan warna yang akan "dihilankan dari gambar" pada nilai parameter ke-3. Untuk menentukan warnanya, kalian juga perlu menggunakan SDL_MapRGB.

 
Kode programnya adalah seperti di bawah ini. Ingat! kalian bisa melihat nama gambarnya di kode program. Kalian sebaiknya menggunakan gambar kalian sendiri dan usahakan ada warna biru atau #0000FF kalau mau pakai kode program ini.
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Rect viewport;
    SDL_Texture *gambar;
    int r, g, b;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0){
        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_Surface *tmp=IMG_Load("gambar.png");
            SDL_SetColorKey(tmp, SDL_TRUE, SDL_MapRGB(tmp->format, 0x00, 0x00, 0xFF));
            int panjang=tmp->w;
            int tinggi=tmp->h;
            
            if(tmp){
                gambar=SDL_CreateTextureFromSurface(trender, tmp);
                SDL_FreeSurface(tmp);
            }
            
            while(evt.type!=SDL_QUIT){
                while(SDL_PollEvent(&evt)){
                }
                if(evt.type==SDL_KEYUP){
                    switch(evt.key.keysym.sym){
                        case SDLK_a:
                            r=0;
                            g=0xFF;
                            b=0xFF;
                            break;
                        case SDLK_s:
                            r=0xFF;
                            g=0;
                            b=0xFF;
                            break;
                        default :
                            r=0xFF;
                            g=0xFF;
                            b=0x00;
                    }
                }
                SDL_SetRenderDrawColor(trender, r, g, b, 0xFF);
                SDL_RenderClear(trender);

                viewport.x=0;
                viewport.y=0;
                viewport.w=panjang;
                viewport.h=tinggi;

                SDL_RenderSetViewport(trender, &viewport);

                if(gambar)SDL_RenderCopy(trender, gambar, NULL, NULL);

                SDL_RenderPresent(trender);
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}

Warna "biru asli" dari gambar seharusnya akan menghilang kalau warna birunya sesuai. Kalau belum sesuai, pengaruhnya tidak akan terlihat. Kalian sebaiknya mengedit gambar kalian dan mengubah warna birunya. Kalian bisa membuat warna lain yang transparan, tapi kalian perlu mengubah kode programnya.

Warna awal dari permukaan window mungkin akan acak karena variabel, r, g, dan b tidak ditentukan nilai awalnya sebelum loop utama dari SDL. Karena kode programnya menggunakan event keyboard, kalian baru akan melihat sesuatu yang berbeda saat tombol keyboard ditekan khususnya a dan s.