Friday, 27 November 2009

SDL : Petualangan Pertama (3)

Tulisan ini merupakan lanjutan dari:
SDL : Petualangan Pertama (1)
SDL : Petualangan Pertama (2)

Ayo, kita lanjutkan!, karena lebih cepat itu lebih baik, sehingga membuat kita semakin pro(fesional) *niru-niru slogan pemilu hehehe... nggak jelas *.
...
// DRAWING STARTS HERE

// clear screen
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
...
Sekarang kita telah memasuki tahap penggambaran (Drawing), yang perlu diperhatikan adalah urutan pengambaran. Jangan sampai gambar kecil dibelakang gambar besar atau gambar background yang menutupi semua permukaan layar (screen) digambar terakhir. SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); akan mengisi (fill) permukaan (surface) dengan warna (SDL_MapRGB()) hitam (kode warna yang digunakan adlah RGB - Red Green Blue, setelah screen->format, yaitu 0,0,0), untuk format awal fungsi SDL_FillRect() dan SDL_MapRGB sebagai berikut:

//untuk SDL_FillRect
extern DECLSPEC int SDLCALL SDL_FillRect
(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

//untuk SDL_MapRGB
extern DECLSPEC Uint32 SDLCALL SDL_MapRGB
(const SDL_PixelFormat * const format,
const Uint8 r, const Uint8 g, const Uint8 b);
SDL_FillRect() juga dapat digunakan untuk menampilkan atau menggambarkan SDL_Rect, contohnya :

/*
mengisi nilai variabel kotak secara langsung dengan
x = 20, y = 30, w = 100, dan h = 80.
*/
SDL_Rect kotak = { 20, 30, 100, 80 };
...

// clear screen
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
SDL_FillRect(screen,&kotak, SDL_MapRGB(screen->format,255, 0, 0));
Maka akan tercipta sebuah kotak dengan warna merah (R=255,G=0,B=0). Yang perlu diingat dalam proses penggambaran adalah jangan membuat objek yang tak terlihat dilayar misalnya memasukkan nilai x lebih besar dari lebar layar karena hanya akan menambah beban komputer aja untuk menggambarnya. Selanjutnya untuk SDL_BlitSurface berfungsi untuk menggambar surface ke dalam surface lainnya:
...
// draw bitmap
SDL_BlitSurface(bmp, 0, screen, &dstrect);

// DRAWING ENDS HERE

// finally, update the screen :)
SDL_Flip(screen);
} // end main loop
...
Argumen pertama diisi dengan SDL_Surface berpointer (SDL_Surface *src) yang akan digambar ke argumen ketiga. Pada argumen kedua diisi dengan SDL_Rect berpointer (SDL_Rect *srcrect), yang berfungsi untuk mengambil bagian tertentu dari gambar secara kotak(matis?!). Ketiga diisi dengan SDL_Surface berpointer (SDL_Surface *dst) yang menjadi tujuan. Kenapa diisi dengan screen (layar)? Karena screen menjadi jendela utama diaplikasi kita yang terlihat jelas. Tetapi kita juga dapat dapat mengisinya dengan variabel yang lain. Argumen keempat diisi seperti argumen kedua (SDL_Rect *dstrect), berfungsi untuk menempatkan objek pada koordinat (x,y) sesuai nilai dari dstrect.x dan dstrect.y. Terakhir adalah proses memperbaharui (update) screen yang menjadi jendela utama (SDL_SetVideoMode()), selanjutnya kembali lagi keawal pengulangan sampai user menekan tombol Close atau ESC untuk menutup program.
...
// free loaded bitmap
SDL_FreeSurface(bmp);

// all is well ;)
printf("Exited cleanly\n");
return 0;
}
...
Kalau sudah keluar dari pengulangan alias program ditutup kita harus melakukan pembersihan terhadap memory jika tidak akan terjadi memory leak (kebocoran memory) yang nantinya bisa menyebabkan komputer hang. Nggak mau dong, ngeliat orang maenin game kita terus pas selesai komputernya hang, Apa Kata Usernya! (a la Naga Bonar ). Tapi jangan membersihkan variabel yang sudah bersih atau pembersihannya 2 kali atau lebih dan jangan menampilkan gambar (SDL_Surface) yang sudah bersih. Sampai sini kita (mestinya) sudah bisa bereksperimen dengan tombol di keyboard (SDLK_...), memanggil inti (init) SDL, menampilkan gambar dengan koordinat ( SDL_Rect posisi = {x,y,w,h}; ) tertentu, dan menutup program dengan aman. Silahkan berkreasi dengan SDL .

- krofz

2 comments:

  1. SDL_Fillrect(screen,0,........

    0 itu maksudnya buat apa ya?

    ReplyDelete
    Replies
    1. argumen kedua diisi dengan tipe data SDL_Rect berpointer.. klo diisi 0 , artinya tidak ada area spesifik yang diwarnai atau di-isi (Fill) dengan objek persegi panjang (Rectangle) , jadi secara default diisi secara keseluruhan surface.

      Delete

Maaf jika komentar anda lama terbitnya ^__^, penulis berusaha OL sesering mungkin. Komentar anda adalah semangat blog ini, dan juga semangat para blogger lainnya. You can use XHTML tags: <a href="" rel="link"> </a>, <strong> </strong>, <b> </b>, <em> </em>, <i> </i>.

Spesial character use :
&lt; for <
&gt; for >


Use Pastebin.com for alternative to display your code :) .

 

back to top

back to top