Thursday, 22 October 2009

SDL : Petualangan Pertama (1)



Don't Forget Your Healing Potion!


Kali ini kita akan membedah kode-kode C++ dan SDL yang telah kita buat melalui template Code::Blocks seperti pada tulisan sebelumnya.


...
int main ( int argc, char** argv )
{
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
...

Jika kita akan membuat program dengan SDL pastikan bahwa pada fungsi utama (int main()) memiliki argumen seperti diatas. Jika tidak maka program tidak akan berjalan. Selanjutnya adalah memulai memanfaatkan SDL dengan "SDL_Init(Uint32 flags)" dengan nilai "SDL_INIT_VIDEO" pada "Uint32". Ini berarti kita hanya menggunakan subsistem SDL yaitu video. Subsistem lainnya seperti audio, waktu dan lainnya belum kita berikan, untuk itu sebaiknya diganti dengan "SDL_INIT_EVERYTHING". Tenang aja untuk performance-nya tidak akan berubah drastis jika kita gunakan seluruh (Everything) subsitem. Jika SDL_Init tidak dapat melakukan inisiliasi maka nilai kembaliannya akan lebih kecil dari 0 sehingga jika program dijalankan di command prompt akan terdapat baris output berupa pesan error. Pesan error tergantung dari permasalahan yang didapat oleh SDL_GetError(). Selanjutnya program akan ditutup dengan nilai 1 (pertanda bahwa program ada masalah). Berikut ini subsistem yang dapat digunakan:


SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_NOPARACHUTE
SDL_INIT_EVENTTHREAD
SDL_INIT_EVERYTHING

Selanjutnya adalah:


...
// make sure SDL cleans up before exit
atexit(SDL_Quit);
...

Dari baris komentar-nya saja mungkin kita sudah tau fungsi baris ini. Setelah kita meng-inisialisasi SDL saat awal program dimulai maka setelah program ditutup, kita harus menutup terlebih dahulu SDL agar terjadi proses bersih-bersih. Dapat juga menggunakan "SDL_Quit();" sebelum kode "return 0;" pada akhir fungsi main (akhir kode).


...
// create a new window
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !screen )
{
printf("Unable to set 640x480 video: %s\n", SDL_GetError());
return 1;
}
...

Kita membuat variabel ber-pointer dengan nama screen dan tipe data SDL_Surface. SDL_Surface ini menampung data berupa gambar, yang tentunya sebelum dimasukkan ke variabel bertipe surface (permukaan - SDL_Surface) harus diproses terlebih dahulu. SDL_SetVideoMode akan membuat sebuah jendela layaknya aplikasi lainnya sehingga dapat menampilkan gambar ke pengguna. Argumen pertama berisi tentang lebar jendela aplikasi kita berjumlah 640 pixel, yang kedua berisi tinggi aplikasi berjumlah 480 pixel, yang ketiga berisi jumlah bit yang terdapat pada pixel (bit per pixel) berjumlah 16 bit. Sedangkan yang keempat akan membuat permukaan layar (jendela) pada sistem memory tanda (flag) lainnya untuk mengisi argumen keempat adalah SDL_SWSURFACE. Selanjutnya akan memeriksa apakah screen bernilai false, karena screen bertipe pointer maka nilai falsenya adalah NULL, kalau pada int(eger) nilai falsenya adalah 0. Sehingga kode sebelumnya dapat dirubah menjadi seperti berikut:


...
//menge-set pointer screen ke NULL
//sangat tepat digunakan jika pointer tidak menunjuk kemanapun
SDL_Surface* screen = NULL;

screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);

if ( screen == NULL )
{
...

Jika ingin melihat fungsi SDL_SetVideoMode() dan beberapa flag untuk argumen keempat (Uint32 flag), silahkan buka file header video "(video.h)". Ok kode selanjutnya :


...
// load an image
SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");

// sama dengan fungsi "if ( bmp == NULL)"
if (!bmp)
{
printf("Unable to load bitmap: %s\n", SDL_GetError());
return 1;
}
...

Membuat variabel untuk menampung gambar dalam hal ini adalah gambar bitmap dengan menggunakan fungsi SDL_LoadBMP (BitMaP), dan nama file yang dituju adalah cb.bmp. File yang dituju harus satu folder dengan file aplikasi (.exe) yang akan dijalankan. Umumnya file pendukung program seperti gambar, suara, huruf, dll, diletakkan pada folder masing-masing sehingga terlihat lebih rapi. Nah agar program menunjuk kesuatu folder misalnya folder gambar, kodenya dapat dirubah menjadi "SDL_LoadBMP("Gambar/cb.bmp");".

Bersambung... ;)

- krofz

14 comments:

  1. Mau tanya nih, " atexit() " itu fungsi dari library SDL atau memang keyword dari C ?

    ReplyDelete
  2. fungsi standar dari C, :)

    untuk lebih jelas nya , silahkan lihat link berikut : http://www.cplusplus.com/reference/cstdlib/atexit/

    ReplyDelete
  3. Oooh.. Lalu apakah "SDL_Surface* screen" itu sama dengan "SDL_Surface *screen"

    ReplyDelete
  4. maksudnya bagaimana yah bro? letak karakter asterisknya (tanda bintang/*)? klo iya nggk pengaruh bro... didempetin juga nggk masalah asal jangan SDL_Surface-nya gabung dengan screen tanpa ada pemisah seperti spasi.

    ReplyDelete
  5. iya, maksud saya itu..

    Makasih jawabannya :)

    ReplyDelete
  6. Kak kalo minta
    #include
    #include
    #include
    tapi di CBnya "no such file or directory" gimana ?

    ReplyDelete
  7. Sudah setting SDL -nya belum? klo belum coba lihat tutorial sebelumnya Setting SDL .... oh ya.. file apa yg dianggap nggk ada? :)

    ReplyDelete
  8. tambahan...karakter '<' atau '&gt' klo dikomentar ini tidak muncul, karena basisnya HTML. Jadi bisa juga pakai kutip dua (") contoh : #include "SDL.h"

    ReplyDelete
  9. sebenarnya inisialisasi itu penting gak sih?

    ReplyDelete
    Replies
    1. pertama kita samakan dulu pandangan inisialisasi...

      misal ada "int A;" , variabel A baru saja di deklarasi atau dibuat. Lalu baris selanjutnya A=0; , maka nilai A di-inisialisasi atau diisi dengan angka 0. Jika tidak diisi dengan angka 0, nilai A bisa berapa saja yang bisa bikin logical error kalau asal operasikan, contoh C=A+B.

      Kalau dalam artikel ini inisialiasi library SDL (SDL_Init() = SDL initialize, ini saya menebak2 :P ) tentu untuk kerpeluan variabel2 atau fungsi2 pada SDL. Jika library tidak ada atau bermasalah/berbeda tentu inisialisasinya gagal.

      Jadi inisialisasi itu penting :D

      Delete
  10. kenapa variable yang digunakan harus bertipe pointer?

    ReplyDelete
    Replies
    1. Banyak manfaat pointer , salah satunya mengurangi variabel global :P

      manfaat lainnya variabel (khususnya tipe class/struct) tidak perlu mencopy seluruh data-nya jika masuk ke parameter pada fungsi, cukup meng-copy alamat-nya aja.

      Delete
  11. SDLSetVideoMode,SDL_LoadBMP itu termasuk tipe data atau bukan ya?

    ReplyDelete
    Replies
    1. bukan bro, itu nama nya fungsi (lihat tutorialnya di : http://www.cplusplus.com/doc/tutorial/functions/ )

      untuk tutorial lainnya : http://www.cplusplus.com/doc/tutorial/

      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