Event Mouse dan Posisi Pointer dalam SDL

Kalau kalian sudah membaca tulisan saya tentang Loop Utama dan Event, kalian mungkin sudah paham bahwa event mouse dalam SDL disimpan dalam file bertipe SDL_Event. Event yang sedang terjadi didapat dengan menggunakan function SDL_PollEvent yang diletakkan dalam perulangan / loop Utama. Anggota variabel yang digunakan unuk menyimpan jenis event-nya adalah type. Jadi, kalau nama variabelnya adalah evt, maka event-nya disimpan dalam "evt.type".

Setelah paham tentang cara penggunaan Event dalam SDL, kalian perlu mempelajari cara mendapatkan posisi koordinat dari pointer mouse. Untuk lebih jelasnya, coba pahami kode program di bawah ini.
#include <SDL2/SDL.h>

int main( int argc, char* args[] ){
    SDL_Window* window = NULL;
    SDL_Event evt;
    SDL_Rect rct;

    SDL_Surface* screenSurface = NULL;

    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{
            screenSurface = SDL_GetWindowSurface( window );
            rct.w=300;
            rct.h=200;
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF) );
            while(evt.type!=SDL_QUIT){
                while(SDL_PollEvent(&evt)){
                           
                    if(evt.type==SDL_MOUSEBUTTONDOWN){
                        rct.x=evt.button.x;
                        rct.y=evt.button.y;
                        SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF) );
                        if(evt.button.button==SDL_BUTTON_LEFT){
                            SDL_FillRect(screenSurface, &rct, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0x00));
                        }else{
                            SDL_FillRect(screenSurface, &rct, SDL_MapRGB( screenSurface->format, 0xFF, 0x00, 0xFF));
                        }
                    }
                    SDL_UpdateWindowSurface( window );
                }
            }
        }
    }

    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}
Kalian bisa meng-compile kode program di atas untuk melihat hasilnya. Pada saat baru pertama dijalankan, program seharusnya hanya menunjukkan warna putih. Jika ingin tahu apa bedanya dengan program-program yang pernah kita buat sebelumnya, coba klik bagian dalam window tersebut!

Persegi panjang yang ada dalam program akan dipindahkan sesuai posisi pointer mouse saat kita melakukan klik pada window. Pada contoh di atas, variabel yang kita gunakan untuk menyimpan informasi terkait semua event adalah evt. Salah satu anggota dari variabel evt adalah "button" yang digunakan untuk menyimpan informasi terkait tombol mouse dan koordinat saat mouse ditekan.Selain itu, pada contoh di atas kita juga menggunakan type yang menyimpan tipe event yang terakhir diproses.

Pada contoh kode program di atas, kita punya variabel evt dengan tipe SDL_Event. Variabel dengan tipe data tersebut memiliki anggota yang menyimpan data terakhir dari masing-masing event. Saat ada event yang berkaitan dengan mouse yang diklik, anggota / member yang digunakan adalah button. Button memiliki beberapa anggota di dalamnya seperti, x, y, button, dll. Kalau nama variabelnya evt, berarti dalam kode program kita bisa menggunakan evt.button yang berupa struct dan memiliki beberapa anggota yang bisa kalian lihat di bawah ini.
Uint32
type
Tipe event yang bisa bernilai SDL_MOUSEBUTTONDOWN atau SDL_MOUSEBUTTONUP

Uint32
timestamp
timestamp dari event

Uint32
windowID
Window yang sedang mendapatkan fokus

Uint32
which
Id dari mouse instance id, atau SDL_TOUCH_MOUSEID jika menggunakan Touch screen.

Uint8
button
Tombol yang diklik

Uint8
state
Keadaan tombol yang bisa bernilai SDL_PRESSED or SDL_RELEASED

Uint8
clicks
Jumlah klik 1, 2, dst. (>= SDL 2.0.2)

Sint32
x
Koordinat x

Sint32
y
Koordinat y

Member x dan y bisa kita gunakan untuk mendapatkan koordinat saat tombol diklik atau digerakkan. Untuk mendapatkan tombol mana yang sedang diklik, pada kode program tersebut kita menggunakan "evt.button.button" karena nama variabel event dalam program adalah evt. Nilai yang mungkin dari evt.button.button, yaitu :
  • SDL_BUTTON_LEFT => Tombol Mouse kiri
  • SDL_BUTTON_MIDDLE => Tombol Mouse tengah
  • SDL_BUTTON_RIGHT => Tombol Mouse kanan
  • SDL_BUTTON_X1
  • SDL_BUTTON_X2

Ingat! Kalian bisa menamai variabel dengan nama apapun selama masih memenuhi syarat penulisan nama identifier. Jadi nama variabel yang kalian gunakan tidak harus sama dengan contoh kode program dari saya! Yang penting tipe datanya sama.

Untuk kalian yang malas mengetik, silakan download kode programnya di sini.