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

No comments:

Post a Comment

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