Collision Detection atau Deteksi Tabrakan

Selanjutnya, kita akan mempelajari tentang cara mengecek tabrakan dua bujur sangkar atau persegi panjang. Untuk mengecek tabrakan kita perlu membuat function supaya kita bisa menggunakannya berkali-kali. Function yang akan kita buat menggunakan parameter bertipe SDL_Rect karena kita sering menggunakan tipe data tersebut untuk menampilkan gambar atau persegi panjang. Penggunaan SDL_Rect akan lebih praktis dibandingkan dengan menggunakan seluruh koordinat sebagai parameter.
int cekTabrakan(SDL_Rect *rct1, SDL_Rect *rct2){
int tabrakan=0;
    if (rct1->x < rct2->x + rct2->w && rct1->x + rct1->w > rct2->x &&
    rct1->y < rct2->y + rct2->h && rct1->y + rct1->h > rct2->y) {
        tabrakan=1;
    }
    return tabrakan;
}
Function untuk mengecek tabrakan tersebut cukup singkat, kan? Kita cuma perlu percabangan if dengan beberapa kondisi dan operator && (and).

Selanjutnya, kita akan satukan functionnya dengan kode program utamanya. Kode program di bawah ini akan menampilkan dua persegi yang akan berubah warna saat bertabrakan.
#include <SDL2/SDL.h>
#define jpotongan 3
#define playar 640
#define tlayar 480

SDL_Renderer *trender=NULL;
int cekTabrakan(SDL_Rect *rct1, SDL_Rect *rct2){
int tabrakan=0;
    if (rct1->x < rct2->x + rct2->w && rct1->x + rct1->w > rct2->x &&
    rct1->y < rct2->y + rct2->h && rct1->y + rct1->h > rct2->y) {
        tabrakan=1;
    }
    return tabrakan;
}

int main(int argc, char* args[]){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Rect rct1={50, 150, 200, 100};
    SDL_Rect rct2={200, 100, 100, 200};

    if( SDL_Init( SDL_INIT_VIDEO ) < 0){
        printf( "Error: %s\n", SDL_GetError() );
    }else{
        window = SDL_CreateWindow( "SDLku", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, playar, tlayar, SDL_WINDOW_SHOWN );
        if( window == NULL ){
            printf( "Error : %s", SDL_GetError() );
        }else{
            trender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            
            while(evt.type!=SDL_QUIT){
                while(SDL_PollEvent(&evt)){
                    if(evt.type==SDL_KEYDOWN){
                        switch(evt.key.keysym.sym){
                            case SDLK_a:
                                rct1.x-=2;
                                break;
                            case SDLK_d:
                                rct1.x+=2;
                                break;
                            case SDLK_s:
                                rct1.y+=2;
                                break;
                            case SDLK_w:
                                rct1.y-=2;
                                break;
                            case SDLK_LEFT:
                                rct2.x-=2;
                                break;
                            case SDLK_RIGHT:
                                rct2.x+=2;
                                break;
                            case SDLK_DOWN:
                                rct2.y+=2;
                                break;
                            case SDLK_UP:
                                rct2.y-=2;
                                break;
                    
                        }
                    }

                    SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0xFF, 0xFF);
                    SDL_RenderClear(trender);
            
            
                    SDL_SetRenderDrawColor(trender, 0xFF, 0xFF, 0x00, 0xFF);
                    SDL_RenderFillRect(trender, &rct2);
            
                    if(cekTabrakan(&rct1, &rct2)!=0)SDL_SetRenderDrawColor(trender, 0xFF, 0x00, 0xFF, 0xFF);
                    else SDL_SetRenderDrawColor(trender, 0xFF, 0x00, 0x00, 0xFF);
                    SDL_RenderFillRect(trender, &rct1);
                    
                    SDL_RenderPresent(trender);
                }
            }
        }
    }

    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
Coba gunakan tombol w, s, a, d, atau tombol panah untuk menggerakkan salah satu kotaknya. Saat kotak bertabrakan warnanya akan berbeda jika dibandingkan dengan saat kotak sudah tidak saling menempel.