Wednesday, 26 May 2010

Klik Tombolnya (3)

Tulisan ini merupakan lanjutan dari:
Klik Tombolnya (1)
Klik Tombolnya (2)


Setelah kita membuat fungsi "proses", yang kurang lebih hanya memeriksa apakah koordinat (x,y) mouse berada diantara / didalam kotak tombol. Maka selanjutnya adalah apakah tombol sudah benar-benar ditekan? Jawabannya ada pada potongan kode berikut:

...
case SDL_MOUSEBUTTONDOWN:
if( event.button.button == SDL_BUTTON_LEFT)
klikKiri = true;
break;
...

case GS_MAINMENU:{
tombol tblPlay(350,140,GS_PLAYGAME);
tombol tblLoad(350,220,GS_LOADGAME);
tombol tblExit(350,300,GS_EXITGAME);

if( klikKiri)
{
if( tblPlay.proses(Xmouse,Ymouse))
gameStatus = tblPlay.getStat();
else if( tblLoad.proses(Xmouse,Ymouse))
gameStatus = tblLoad.getStat();
else if( tblExit.proses(Xmouse,Ymouse))
gameStatus = tblExit.getStat();
}

//DRAWING TIME!!
showTeks(40,80,"Ini adalah Menu Utama");
tblPlay.tampil("Play Game");
tblLoad.tampil("Load Game");
tblExit.tampil("Exit Game");
} break;
...
Potongan kode diatas (case GS_MAINMENU: ...) adalah bagian dari layout atau frame Main Menu. Dapat dilihat bahwa sebelum kita memproses koordinat mouse terhadap tombol, sebelumnya kita memastikan apakah tombol kiri telah ditekan? Jika iya maka nilai klikKiri akan bernilai true. Tapi jika kita tidak mereset kembali nilai klikKiri menjadi false maka saat tombol kiri mouse ditekan tanpa ada diatas objek tombol, ketika pergerakan mouse melewati objek tombol tertentu tanpa penekanan tombol kiri mouse, maka proses tetap terjadi. Ini terjadi karena nilai klikKiri selalu true. Maka itu diawal loop main klikKiri diset menjadi false:

...
while (!done)
{
klikKiri = false;
...
Sampai disini kita sudah dapat berkreasi dengan menggunakan mouse. Berikut contoh screenshot game yang populer dari sekian buanyakknya game dengan menggunakan mouse:

Gambar 1. Mystery PI Lottery Ticket.

Gambar 2. The Secret of Monkey Island (untuk PC tentunya).


- krofz

Tuesday, 18 May 2010

Klik Tombolnya (2)

Tulisan ini merupakan lanjutan dari:
Klik Tombolnya (1)

Berikut potongan kode yang akan mengambil input dari mouse:
...
case SDL_MOUSEMOTION:
Xmouse = event.motion.x;
Ymouse = event.motion.y;
break;

case SDL_MOUSEBUTTONDOWN:
if( event.button.button == SDL_BUTTON_LEFT)
klikKiri = true;
break;

default:;
} // end switch
} // end of message processing
...
"SDL_MOUSEMOTION" akan mengambil pergerakan (motion) dari mouse, lalu mengambil posisi x dan y mouse berada (pada program SDL kita). Sebetulnya kita juga dapat mengambil nilai x dan y diluar event.type atau SDL_PollEvent(), misal setelah pengulangan while, seperti kode berikut:
...
// message processing loop
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
...
} // end switch
} // end of message processing

Xmouse = event.motion.x;
Ymouse = event.motion.y;
...
Karena belum tahu efek samping dari kode diatas jadi nggak berani macem-macem dulu (udah nyoba sih tapi nggak kenapa-napa hahaha...), tapi entah kenapa enakan memperoleh nilainya melalui event.type, lalu SDL_MOUSEMOTION. Mungkin karena lebih sah mengambil nilainya? hahaha... biar panjang asal selamat. Selanjutnya SDL_MOUSEBUTTONDOWN, sesuai namanya tipe dari event ini akan mengambil masukkan (input) dari tombol kiri dan kanan mouse. Bagaimana dengan tombol scroll? Yang buat ngegulung-ngulung halaman? Sementara jangan pusingin begituan, karena aku juga pusing mikirin begituan . Nilai dari klik kiri dan klik kanan mouse ada pada struktur event.button.button". Sampai disini baru mengambil nilai dari tombol mouse yang ditekan, ternyata ada juga event tipe setelah tombol mouse dilepas alias udah nggak ditekan, berikut contoh kodenya:

...
case SDL_MOUSEBUTTONUP:
if( event.button.button == SDL_BUTTON_LEFT)
//melakukan sesuatu jika tombol kiri mouse dilepas
else if( event.button.button = SDL_BUTTON_RIGHT)
//kalau tombol kanan mouse dilepas
break;
...
Dengan mengetahui "SDL_MOUSEBUTTONUP" atau tombol dilepas, kita dapat membuat beberapa jenis tombol. Misal pada beberapa tombol harus dilepas dahulu (bisa diatas area tombol tersebut atau diluarnya), karena untuk memberikan pilihan kepada user akan pilihan yang telah dipilihnya (mulai muter-muter deh.. bahasanya). Contohnya tombol "Exit Game" yang setelah diklik akan memunculkan pilihan "Yes" atau "No", lalu tombol yes baru bisa ditekan bila klik kiri sudah ditekan dan dilepas pada area tombol (biar lebih lama gitu programnya dijalanin ). Lalu dimana bagian yang akan memproses jika memang tombol kiri mouse sudah ditekan (tidak termasuk saat tombol dilepas)? Bagian ini ada dalam anggota kelas tombol berupa sebuah fungsi dengan dua parameter (nilai X dan Y mouse). Berikut kodenya:

...
bool tombol::proses(int X, int Y)
{
if( X > kotak.x && X < (kotak.x+kotak.w) &&
Y > kotak.y && Y < (kotak.y+kotak.h))
{
return true;
}
return false;
}

...
//dapat juga " if( tblPlay.proses(event.motion.x, event.motion.y))
if( tblPlay.proses(Xmouse,Ymouse))
gameStatus = tblPlay.getStat();
...

Fungsi ini nggak neko-neko dia juga akan bernilai false dan true aja. Untuk mempermudahkan dalam membuat sebuah tombol kita membungkus variabel-variabel yang diperlukan kedalam suatu objek. Dan dalam hal ini adalah pembuatan kelas (class) bernama tombol, yang didalam terdapat variabel dan fungsi. Inilah kehebatan "Pemrograman Berorientasi Objek (PBO)" atau bahasa inggrisnya Object Oriented Programming (OOP) hehe.. sok inggris. Tidak hanya kelas tombol yang memudahkan kita dalam program ini, tetapi juga fungsi "void showTeks(int X, int Y, std::string kalimat)" yang mesti kita ajak jalan-jalan dulu karena banyak menolong :D . Tetapi fungsi ini masih ada beberapa kelemahan atau bug, yaitu ketika suatu string berakhiran '#n' (tanpa tanda kutip) atau memiliki lebih dari 4 karakter '#n' maka program akan langsung tertutup. Ini disebabkan program berusaha menampilkan nilai dari string tempKal[], sedangkan tempKal[] hanya dideklarasikan atau buat tanpa satupun nilai. Sedangkan buat string yang kelebihan baris atau '#n' (dengan menganalogikan '#n' sebagai baris, dan dalam hal ini maksimal 5), kita dapat akali dengan mendapatkan terlebih dahulu berapa banyak baris atau '#n' pada string. Jadi kode "void showTeks(int X, int Y, std::string kalimat)"-nya menjadi seperti berikut:

...
void showTeks(int X, int Y, std::string kalimat)
{
//berapa banyak baris yang dibutuhkan
int noTemp = 0, baris = 1;

for( std::string::iterator iKalimat = kalimat.begin();
iKalimat < kalimat.end(); ++iKalimat)
{
if( *iKalimat == '#'){
++iKalimat;
if( *iKalimat == 'n') baris++;
}
}

std::string tempKal[baris]; //temporary kalimat

//biar tempKal memiliki nilai dan nggak error pas diminta nilainya
for( int c=0;c<baris;c++){
tempKal[c] = " ";
}

for( std::string::iterator iKalimat = kalimat.begin();
iKalimat < kalimat.end(); ++iKalimat)
{
//jika karakternya sama dengan '\'
if( *iKalimat != '#')tempKal[noTemp]+= *iKalimat;
else{
++iKalimat;
if( *iKalimat == 'n') noTemp++;
else tempKal[noTemp]+=*iKalimat;
}
}

//make it easy :D
for( int c=0;c < baris;c++){
SDL_Surface *kal = NULL; //kal, for kalimat :p
kal = TTF_RenderText_Solid(huruf,tempKal[c].c_str(),wrn_putih);
terapinGbr(X,Y+(kal->h*c),kal,screen);

//dibersihin dulu biar nggak numpuk
SDL_FreeSurface( kal);
}
}
...
Hahaha... akhirnya bugnya teratasi juga... baru nyadar kalau ada bug soalnya . Program ini juga belum efisien dalam menampilkan teks apalagi mencet-mencet tombolnya. Tapi, takkan ada uang Rp. 1.000.100,- tanpa 100 perak.. Maksud Lho?? hahaha....

- krofz

Tuesday, 11 May 2010

Klik Tombolnya (1)





Kali ini kita akan membuat program SDL yang akan memeriksa event untuk 'Mouse'. Karena game kita ditujukan untuk PC, otomatis perangkat input yang paling banyak digunakan sekarang adalah Mouse. Tidak seperti game untuk flatform konsol (console) yang kalau dibuild ulang untuk PC kemungkinan besar dapat dimainkan tanpa mouse alias pakai keyboard saja. Karena nggak banyak waktu luang (karena waktunya abis maen game terus <-- soalnya baru abis upgrade PC hehe... ~ agak nggk penting sih), berikut ini source codenya saja dulu sama program jadinya.

Link : http://www.mediafire.com/download/gij4bb841qn4890/Klik_Tombolnya_with_Audio.7z
Size : 715 KB

. Di sini juga tidak hanya bagaimana mendapat event mouse, tapi juga menampilkan string/kalimat biar lebih gampang, serta merancang tampilan game kaya game-game modern saat ini (ada Play Game, Load Game, Options, dll). Soo... download aja dulu file nya hehehe.... nanti kita bedah... satu-persatu

- krofz
Update 22 Juni 2013 for Download link and content :)
Next Part : Klik Tombolnya (2)
 

back to top

back to top