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

Thursday, 19 November 2009

Musibah dari Virus W32/Chir.B

Emang nasib lagi kurang baik bagiku . Gimana nggak ngeselin kena virus (virus apa worm yah? *bingung sendiri*) yang nginfeksi file .exe sama .html. Terpaksa deh scan komputer, mana komputer jadul lagi, scannya lama banget. Pertama pake PCMAV versi 2.2 kalau make PCMAV file yang terinfeksi nggak keditek (detect) kecuali file induk/utama-nya. Tapi kalau make Avira Free versi 9.x (yang udah diupdate) siap-siap dengerin suara merdu (beep) ala Avira kalau komputer banyak file .html, dan tentunya file .exe juga banyak. Virus ini juga ngebikin sebuah file dengan nama readme.eml (sejenis file email), yang menurut sumber yang aku cari file ini akan mengirimkan data pribadi (nggak tau data apaan yang pasti nggak menyenangkan) ke pembuatnya mungkin atau ke tempat tertentu, kalau terhubung ke-internet. File readme.eml ini kebaca dengan nama virus W32/Runouce.B2:


Gambar 1. Setelah selesai Scan

Virus ini emang nggak terlalu berbahaya, nggak ngilangin folder options, disable task manager, dan kegiatan berbahaya lainnya (hapus file) alias low risk.
Cuma aktifitas-nya yang nyari file diharddisk bikin lambat, dan nginfeksi file .exe sama .html yang bikin kesel. Bayangin kalau semua file .exe keinfeksi terus sama avira yang opsi-nya cuma ada Move to Quarantine sama Delete. Move to Quarantine bisa bikin prosesnya sangat lama karena kalau di komputer kita banyak program dan masing-masing program punya banyak file .exe dan .html (terutama program berat seperti Adobe Photoshop yang banyak file tutorial dan helpnya) bisa jadi komputer nge-hang karena RAM/memori (ditambah baca/tulis harddisk yang lama) kepakai untuk pemindahan file asli ke Quarantine itu sangat banyak. Syukur kalau komputernya, komputer super kalau komputernya P4 pertama
bisa nangis darah nungguin prosesnya.

Untuk file .exe yang keinfeksi terpaksa di-instal ulang programnya (kedua udah ada program buat ngebersihin file tersebut, kalau ada bagi dong) kalau udah bersih komputernya. Tapi kalau setup/installer/paket programnya yang keinfeksi siap-siap ke toko cd software atau ke internet jika nggak punya backup-an softwarenya. Tapi untuk file .html yang keinfeksi ada cara untuk menyalamatkan file tersebut dan membuat para antivirus tidak membaca/men-detek (enakan ditek yah? <-ngacauin bahasa) file itu adalah virus. Ini dia caranya , pertama buka file .html itu dengan notepad lalu pergi ke bagian akhir file terus cari teks yang diblok pada gambar:


Gambar 2. Membersihkan file .html

Hapus string <script language="JavaScript">window.open("readme.eml",null,"resizable=no, top=6000,left=6000")</script></html> terus simpan (save). Coba scan lagi file yang diditek sama antivirus (Avira contohnya) sebagai virus. Dijamin Avira akan lupa kalau file itu adalah (mantan) virus habis kau W32/Chir.B . Sip kalau nggak keditek virus lagi berarti anda sudah seperti Arnold dalam film Eraser hehehe . Oh yah, sorry nggak ngupdate blog dengan materi "Membuat Game Dengan C++" maklum lagi sibuk kerja .

- krofz

Wednesday, 4 November 2009

SDL : Petualangan Pertama (2)

Jelajahi Dengan Petamu!

Tulisan ini merupakan lanjutan dari:

SDL : Petualangan Pertama (1)

...
// centre the bitmap on screen
SDL_Rect dstrect;
dstrect.x = (screen->w - bmp->w) / 2;
dstrect.y = (screen->h - bmp->h) / 2;
...
Kode diatas akan menempatkan gambar bitmap tepat ditengah-tengah dengan perhitungan secara matematis. "SDL_Rect" berfungsi untuk membuat sebuah objek berupa kotak/bujur sangkar (Rect - Rectangle) yang memiliki anggota (member) yaitu variabel x untuk koordinat x, y untuk koordinat y, w untuk width (lebar), dan h untuk height (tinggi). Karena yang akan kita buat adalah program 2D maka sumbu yang digunakan hanya x dan y (ya iyalah 2 dimensi). Yang perlu diperhatikan dalam program SDL adalah bahwa nilai koordinat y semakin keatas semakin minus (-) sedangkan umumnya adalah plus (+).

Gambar 1. (A) Nilai koordinat pada umumnya, (B) nilai koordinat pada SDL. (sumber : My SDL Teacher)

Nilai koordinat x (dstrect) didapat dari lebar layar (screen->w) dikurang lebar gambar lalu dibagi 2. Begitu juga dengan koordinat y didapat dari pengurangan tinggi layar dengan tinggi gambar. Cara atau perhitungan ini membuat penempatan gambar lebih efisien dibanding memasukkan nilai x dan y secara manual. Untuk membuktikannya ubah gambar cb.bmp dengan ukuran pixel (lebar dan tinggi) yang berbeda.

"Tanda panah kekanan (->) itu untuk apaan yah?", tanda ini digunakan untuk memanggil anggota (member) dari suatu variabel berpointer yang memiliki tipe data bentukan seperti struct, class, dll. Contoh:
...
struct orang
{
int umur;
};

orang Budi;
orang* Rudi;

Budi.umur = 10;
Rudi = &Budi;

cout<<"Umur Budi = "<<Budi.umur<<endl;
cout<<"Umur Rudi = "<<Rudi->umur<<endl;
...
Karena Rudi bertipe pointer dan menunjuk ke alamat Budi sehingga umur Rudi didapat dari umur Budi. Tetapi untuk pemanggilan anggotanya, Rudi harus menggunakan tanda panah -> dan Budi menggunakan titik. Bayangkan jika kedua variabel tersebut menggunakan titik, kita tidak tau yang mana yang berpointer dan yang tidak, simple kan ;D.
...
// program main loop
bool done = false;
while (!done)
{
// message processing loop
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT: done = true; break;

// check for keypresses
case SDL_KEYDOWN:
{
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE)
done = true;
break;
}
} // end switch
} // end of message processing
...
Di bagian ini program mulai berjalan terus menerus tanpa henti (yah nge-hang dong?!, nggak ntar bisa ditutup). Karena kita tidak tau kapan program akan dihentikan makan pengulangan yang cocok adalah while, selama done sama dengan false - (!done) atau (done == false). SDL_Event berfungsi untuk menangani suatu kejadian, kejadian disini adalah ketika user memberikan input seperti menekan tombol close (lambang X dipojok kanan window), keyboard, mouse, dll. Selanjutnya kita memasuki fungsi SDL_PollEvent() yang argumennya kita isi dengan alamat variabel event, untuk format awal fungsi SDL_PollEvent():
...
/* Polls for currently pending events, and returns 1 if there are any pending
events, or 0 if there are none available. If 'event' is not NULL, the next
event is removed from the queue and stored in that area.
*/
extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event);
...
Fungsi ini akan terus terjadi selama (while) masih ada pemberian (poll) input. Ketika suatu event terjadi maka event itu akan ditaruh didalam suatu antrian (queue) event, antrian ini menyimpan data event untuk setiap event yang terjadi. Selanjutnya pengecekan tipe dari event menggunakan switch, SDL_QUIT berasal dari penekanan tombol X dipojok kanan window. SDL_KEYDOWN untuk penekanan keyboard. Selain kedua tipe tadi ada juga SDL_MOUSEMOTION untuk pergerakan mouse, SDL_MOUSEBUTTONDOWN untuk penekanan tombol mouse. event.key.keysym.sym untuk setiap pengecekan tombol keyboard kita memanggil struktur dengan nama "key" yang memiliki struktur lagi yaitu "keysym", dan struktur terakhir "sym" (panjang yah?!...) dan yang menampung data event (keyboard) adalah "sym". SDL Key (SDLK_..) lainnya:
SDLK_0 - SDLK_9
SDLK_a - SDLK_z
SDLK_F1 - SDLK_F15
//dan beberapa karakter lainnya
SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT
SDLK_DOLLAR
//dan sebagainya
Sedikit kode lagi akan kita bedah.... tapi pembedahan ini menguras banyak tenaga dan pikiran hehehe... rileks-kan tubuh dan pikiranmu dengan bermain game favoritmu. So,.. Masih bersambung... ;)

- krofz
 

back to top

back to top