Workshop Project 2 Collision Detection Mohammad Zikky, S.ST, M.T
gotoxy(kolom1, baris1); cout << teks1; Overview Diandaikan kita mempunyai 2 buah objek, teks1 dan teks2. Setiap objek ini memiliki posisi tertentu dilayar yang ditandai dengan kolom dan baris, kolom1 dan baris1 adalah posisi dari teks1 sedangkan kolom2 dan baris2 adalah posisi dari teks2. Jika kita ingin menempatkan teks1 pada posisinya maka yang perlu dilakukan adalah Memanggil fungsi gotoxy() dengan kolom1 dan baris1 sebagai parameternya. Kemudian mencetak teks1 gotoxy(kolom1, baris1); cout << teks1;
Overview Hal yang sama juga bisa dilakukan untuk teks2. Jika teks1 = ”ABC“ (tiga karakter/huruf) maka ketiga huruf tersebut akan menempati posisi berikut: Contoh : kolom1 = 5 baris1 = 10 Huruf Posisi A kolom1, baris1 B kolom1 + 1, baris1 C kolom1 + 2, baris1 Huruf Posisi A 5, 10 B 6+ 10 C 7+ 10
gotoxy(kolom2, baris2); cout << teks2; Penjelasan Lanjut Dengan pengetahuan tersebut, berikut ini akan dijelaskan bagaimana caranya mendeteksi terjadinya tabarakan: Andaikan teks2 = “x“ (sebuah karakter), berarti jika kita menggunakan perintah berikut : gotoxy(kolom2, baris2); cout << teks2; maka karakter “x“ akan menempati posisi kolom2 dan baris2. Dengan demikin tabrakan akan terjadi jika kondisi berikut terpenuhi : baris2 = baris1 dan kolom2 = kolom1 (kolom huruf A) atau baris2 = baris1 dan kolom2 = kolom1 + 1 (kolom huruf B) atau baris2 = baris1 dan kolom2 = kolom1 + 2 (kolom huruf C)
Jalankan Source Code Berikut dan Amati #include<iostream> #include<windows.h> using namespace std; //variabel global untuk menyimpan informasi //tombol yang ditekan INPUT_RECORD InRec; //fungsi delay(), digunakan untuk menunda proses eksekusi //selama beberapa millisecond #define delay Sleep //fungsi gotoxy(), digunakan untuk menempatkan kursor //pada posisi KOLOM dan BARIS void gotoxy(unsigned int kolom, unsigned int baris) { COORD posisi = {kolom,baris}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), posisi); } //fungsi kbhit(), digunakan untuk mendeteksi terjadinya //penekanan tombol. Jika terdapat tombol yang ditekan maka fungsi ini //akan mengembalikan nilai TRUE sebaliknya FALSE bool kbhit() DWORD EventCount,NumRead; GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &EventCount); if(EventCount>0) ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &InRec, 1, &NumRead); return (InRec.EventType == KEY_EVENT); //fungsi getch(), digunakan untuk mengambil informasi tombol yang //terakhir kali ditekan. char getch() return InRec.Event.KeyEvent.uChar.AsciiChar; int main() { char tekan='X'; //kontrol arah gerak tulisan //kalau TRUE tulisan akan bergerak ke KANAN (MAJU) //kalau FALSE tulisan akan bergerak ke KIRI (MUNDUR) bool maju = true; bool atas = true; //area animasi unsigned int BATASKANAN = 45; unsigned int BATASKIRI = 10; unsigned int BATASATAS = 11; unsigned int BATASBAWAH = 13; unsigned int kolom = 10; //kolom untuk tulisan "CPP" unsigned int baris = 12; //baris untuk tulisan "CPP" unsigned int kolom2 = 26; //kolom untuk tulisan "X" unsigned int baris2 = 14; //baris untuk tulisan "X" unsigned int tabrak = 0; //teks yang akan dicetak string teks = "CPP"; string teks2= "x"; gotoxy(10,4); cout << "========================================="; gotoxy(10,5); cout << "== Animasi - Teknik Deteksi Tabrakan =="; gotoxy(10,8); cout << "========================================="; gotoxy(10,16); cout << " Tabrakan = 0 "; gotoxy(10,18); cout << " [ Tekan 'x' Untuk Keluar ] ";
Jalankan Source Code Berikut dan Amati (lanjutan) { baris2++; } //deteksi tabrakan if (baris2==baris) if (kolom2>=kolom && kolom2<=kolom+teks.length()) tabrak++; gotoxy(32,16); cout << tabrak; //TULIS teks gotoxy(kolom,baris); cout<< teks; gotoxy(kolom2,baris2); cout << teks2; //cek apakah terjadi penekanan tombol, //jika 'ya', simpan tombol tersebut pada variabel TEKAN if(kbhit()) tekan = getch(); delay(50); //HAPUS teks cout.width(teks.length()); //Coba deh, tambahkan titik di antara tanda kutip berikut //apa yang terjadi ? cout.fill(' '); //Diantara tanda kutip berikut, akan diisi dengan KARAKATER //yang ditentukan lewat fungsi cout.fill(KARAKATER) diatas gotoxy(kolom,baris); cout<<""; //hapus teks2 gotoxy(kolom2,baris2); cout << " "; //perulangan ini akan diulang selama tekan TIDAK SAMA dengan 'x' while(tekan!='x') { //kontrol posisi teks "CPP" if(maju==true) //coba deh, ganti bagian ini dengan 'kolom>=BATASKANAN' //apa yang terjadi ? if (kolom>=BATASKANAN-teks.length()) maju=false; } else kolom++; } if (kolom<=BATASKIRI) maju=true; kolom--; //kontrol poisi teks "x" if(atas==true) if(baris2<=BATASATAS) atas=false; baris2--; if(baris2>=BATASBAWAH) atas=true;
Implementasi Project: Game Spacewar Sederhana
Contoh Game Sederhana Contoh dari implementasi collision detection adalah game spacewar. Disini akan dicontohkan prototype game spacewar sederhana dengaN c++. Untuk bisa membuat game ini, pengetahuan yang sudah diperkenalkan pada pembahasan sebelumnya sangat dibutuhkan Seperti pengetahuan fungsi yang bisa mengenali penekanan tombol PANAH dan SPASI. Untuk itu dibutuhkan modifikasi pada fungsi kbhit() dan getch()
Jalankan Source Code Berikut dan Amati unsigned int getch(bool kodeAscii=true) { if(kodeAscii==true) return InRec.Event.KeyEvent.uChar.AsciiChar; else return InRec.Event.KeyEvent.wVirtualKeyCode; } // DAFTAR TOMBOL //daftar ini akan berlaku jika kita memanggil fungsi getch() //seperti berikut : getch(false); const unsigned int PANAH_KIRI = 37; const unsigned int PANAH_KANAN = 39; const unsigned int PANAH_ATAS = 38; const unsigned int PANAH_BAWAH = 40; const unsigned int SPASI = 32; //huruf A atau a mempunyai kode yang sama. Aturan yang sama berlaku //untuk huruf yang lain. //huruf A ... Z dimulai dari 65 .. 90 //angka 0 ... 9 dimulai dari 48 .. 57 const unsigned int HURUF_X = 88; int main() gotoxy(10,4); cout << "==================================="; gotoxy(10,5); cout << "== Game Spaceware Sederhana =="; gotoxy(10,8); cout << "==================================="; gotoxy(10,19); cout << " ARAH SENJATA = "; gotoxy(10,20); cout << " TEMBAK = TIDAK "; gotoxy(10,21); cout << " KENA = 0 "; gotoxy(10,22); cout << " [ Tekan 'x' Untuk Keluar ] "; unsigned int tekan='w'; //kontrol arah gerak tulisan //kalau TRUE tulisan akan bergerak ke KANAN (MAJU) //kalau FALSE tulisan akan bergerak ke KIRI (MUNDUR) bool maju = true; //kalau tombol SPASI ditekan, //variable ini akan di set TRUE bool tembak = false; #include<iostream> #include<windows.h> using namespace std; //variabel global untuk menyimpan informasi //tombol yang ditekan INPUT_RECORD InRec; //fungsi delay(), digunakan untuk menunda proses eksekusi //selama beberapa millisecond #define delay Sleep //fungsi gotoxy(), digunakan untuk menempatkan kursor //pada posisi KOLOM dan BARIS void gotoxy(unsigned int kolom, unsigned int baris) { COORD posisi = {kolom,baris}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), posisi); } //fungsi kbhit(), digunakan untuk mendeteksi terjadinya //penekanan tombol. Jika terdapat tombol yang ditekan maka fungsi ini //akan mengembalikan nilai TRUE sebaliknya FALSE bool kbhit() bool result = false; DWORD EventCount,NumRead; GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &EventCount); if(EventCount>0) ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &InRec, 1, &NumRead); result = InRec.EventType == KEY_EVENT; return result; //fungsi getch(), digunakan untuk mengambil informasi tombol yang //terakhir kali ditekan.
Jalankan Source Code Berikut dan Amati (lanjutan 1) //area animasi unsigned int BATASKANAN = 45; unsigned int BATASKIRI = 10; unsigned int BATASATAS = 10; //Batas atas dari jalannya PELURU unsigned int kolom = 10; unsigned int baris = 10; //kolom dari TARGET unsigned int kolom1 = 20; //baris dari TARGET unsigned int baris1 = 18; //kolom dari SENJATA unsigned int kolom2 = 20; //baris dari SENJATA unsigned int baris2 = 17; //kolom dari PELURU unsigned int kena = 0; //baris dari PELURU //teks yang akan dicetak string target = "..0.."; string senjata = "^"; string peluru = "+"; //perulangan ini akan diulang selama tekan TIDAK SAMA dengan 'x' while(tekan!=HURUF_X) { //kontrol posisi if(maju==true) //coba deh, ganti bagian ini dengan 'kolom>=BATASKANAN' //apa yang terjadi ? if (kolom>=BATASKANAN-target.length()) maju=false; } else kolom++; } if (kolom<=BATASKIRI) maju=true; kolom--; //kontrol senjata if(tekan == PANAH_KANAN) { //reset tombol tekan tekan=0; if (kolom1<BATASKANAN-senjata.length()) kolom1++; kolom2 = kolom1; } gotoxy(30,19);cout<<"KANAN"; } else if(tekan==PANAH_KIRI) if (kolom1>BATASKIRI) kolom1--; gotoxy(30,19);cout<<"KIRI "; if(tekan==SPASI) tembak = true; baris2 = 17;
Jalankan Source Code Berikut dan Amati (lanjutan 2) //kontrol peluru if(tembak==true) { if (baris2>BATASATAS) //peluru selalu bergerak ke atas. //ini berarti baris harus dikurangi baris2--; gotoxy(30,20);cout << " IYA "; } else //ketika posisi peluru sudah mencapai BATASATAS //kita bisa tembak lagi. tembak=false; //deteksi tabrakan PELURU & teks CPP if(kolom2>=kolom && kolom2<=kolom+target.length()-1) kena++; gotoxy(30,21);cout << kena; } gotoxy(30,20);cout << "TIDAK"; //TULIS teks gotoxy(kolom,baris); cout<< target; //menampilkan senjata gotoxy(kolom1,baris1); cout << senjata; //menampilkan peluru //hanya dilakukan jika kita menembak gotoxy(kolom2,baris2); cout << peluru; //cek apakah terjadi penekanan tombol, //jika 'ya', simpan tombol tersebut pada variabel TEKAN if(kbhit()) tekan = getch(false); //cout << " " <<tekan<<" "; //Cek kode tombol yang ditekan, aktifkan baris ini. delay(50); //HAPUS teks cout.width(target.length()); //Coba deh, tambahkan titik di antara tanda kutip berikut //apa yang terjadi ? cout.fill(' '); //Diantara tanda kutip berikut, akan diisi dengan KARAKATER //yang ditentukan lewat fungsi cout.fill(KARAKATER) diatas gotoxy(kolom,baris); cout<<""; //hapus posisi lama senjata gotoxy(kolom1,baris1); cout <<" "; //hapus posisi lama peluru if(tembak==true) { gotoxy(kolom2,baris2); cout <<" "; }
Percobaan lebih lanjut Pahami masing-masing fungsi dan baris program dan kembangkan menjadi game spaceware dengan musuh yang lebih banyak. Jika sudah berhasil, coba berikan tembakan juga pada musuh, jika mengenai pesawat lakon (^), kurangi skor/kena minus 1 (-1) Analisa dan jelaskan hasil praktikumnya Buat laporan