Memotong Gambar dengan SDL_BlitSurface

Dengan SDL_Kita bisa menampilkan potongan gambar derdasarkan koordinat yang sudah kita tentukan. Penggunaan satu gambar yang dipotong-potong akan mempermudah kita dalam memuat gambar karena kita hanya butuh satu file untuk menyimpan rangkaian gerakan dan bagian yang akan kita gunakan berulang-ulang. Kita bisa menggunakan variabel bertipe SDL_Rect untuk menentukan bagian yang dipotong beserta ukurannya.

Bagi yang sudah membaca tulisan-tulisan saya sebelumnya, seharusnya kalian sudah membaca tentang cara menampilkan gambar bitmap dengan function SDL_BlitSurface dan bagaimana menentukan posisinya. Untuk menentukan posisi gambar yang akan ditampilkan di window, kita menggunakan parameter ke-4 dari SDL_BlitSurface. Parameter pertama dan ke-3 yang bertipe SDL_Surface digunakan untuk menentukan gambar dan surface yang akan diberi gambar.

Memotong Gambar dari Titik tertentu

Parameter kedua dari SDL_BlitSurface digunakan untuk menentukan titik awal dan ukuran dari potongan. Kalian bisa memotong gambar dari titik tertentu dengan SDL_BlitSurface. Supaya lebih jelas, kita akan langsung mencoba memotong  gambar di bawah ini.

Gambar tersebut akan kita potong jadi seperempat bagian dari titik tengahnya. Kode program yang kita perlukan adalah sebagai berikut.
#include <SDL2/SDL.h>

struct informasi{
    SDL_Window *window;
    SDL_Surface *surface;
    SDL_Surface *gambar;
};

int loop_utama(struct informasi *info){
    SDL_Event evt;
    SDL_Surface *gambar=info->gambar;
    SDL_Rect rct;
  
    rct.w=gambar->w/2;
    rct.h=gambar->h/2;

    rct.x=rct.w;
    rct.y=rct.h;
    while(SDL_PollEvent(&evt)){
        //proses event selain SDL_QUIT di sini
    }
    SDL_FillRect( info->surface, NULL, SDL_MapRGB( info->surface->format, 0xFF, 0xFF, 0x00) );
    SDL_BlitSurface(gambar, &rct, info->surface, 0);
    SDL_UpdateWindowSurface( info->window );

    return evt.type;
}

int main( int argc, char* args[] ){
    struct informasi info;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        info.window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( info.window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            info.surface = SDL_GetWindowSurface( info.window );
            info.gambar=SDL_LoadBMP("Codelogi.bmp");
            while(loop_utama(&info)!=SDL_QUIT);//ulangi proses sampai tombol close window ditekan
         }
     }

     SDL_DestroyWindow( info.window );
     SDL_Quit();

     return 0;
}

Untuk menggunakan gambar dalam program, kita harus meletakkan gambar yang diperlukan ke dalam folder tempat program kita atau direktori yang sedang aktif. Kalau kita menjalankannya dari project, tempatnya adalah di folder terluar dari project kita.

Menentukan Posisi Gambar

Gambar di program yang dihasilkan kode program sebelumnya ditampilkan di sisi kiri atas window karena parameter terakhir dari SDL_BlitSurface bernilai NULL. Kalau kita ingin meletakkannya di posisi lain, maka kita perlu menggunakan variabel bertipe SDL_Rect pada parameter terakhir atau ke-4 dari function tersebut.

#include <SDL2/SDL.h>

struct informasi{
    SDL_Window *window;
    SDL_Surface *surface;
    SDL_Surface *gambar;
};

int loop_utama(struct informasi *info){
SDL_Event evt;
SDL_Surface *gambar=info->gambar;
SDL_Rect rct, rcd;
    //ukuran potongan gambar
    rct.w=gambar->w/2;
    rct.h=gambar->h/2;
    //titik awal potongan gambar
    rct.x=rct.w;
    rct.y=rct.h;

    //atur posisi gambar
    rcd.x=info->surface->w/2-rct.w/2;
    rcd.y=info->surface->h/2-rct.h/2;

    while(SDL_PollEvent(&evt)){
        //proses event selain SDL_QUIT di sini
    }
    SDL_FillRect( info->surface, NULL, SDL_MapRGB( info->surface->format, 0xFF, 0xFF, 0x00) );
    SDL_BlitSurface(gambar, &rct, info->surface, &rcd);
    SDL_UpdateWindowSurface( info->window );

    return evt.type;
}

int main( int argc, char* args[] ){
    struct informasi info;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 ){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        info.window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN );
        if( info.window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            info.surface = SDL_GetWindowSurface( info.window );
            info.gambar=SDL_LoadBMP("Codelogi.bmp");
            while(loop_utama(&info)!=SDL_QUIT);//ulangi proses sampai tombol close window ditekan
         }
     }

     SDL_DestroyWindow( info.window );
     SDL_Quit();

     return 0;
}

Btw, ukuran gambar tidak bisa ditentukan saat kita menggunakan SDL_BlitSurface. Ada function lain yang bisa kita gunakan jika kita ingin mengubah ukuran gambar agar lebih besar atau lebih kecil. Sementara ini, saya rasa cukup sampai di sini dulu tulisan saya. 

Kalau kalian malasa mengetik atau tidak tahu cara membuat project-nya, kalian bisa mendownload kode programnya di sini.