120 likes | 248 Views
Workshop Project 2 Collision Detection. Mohammad Zikky, S.ST, M.T. Overview.
E N D
Workshop Project 2Collision Detection Mohammad Zikky, S.ST, M.T
Overview • Diandaikankitamempunyai 2 buahobjek, teks1 danteks2. Setiapobjekinimemilikiposisitertentudilayaryang ditandaidengankolomdanbaris, kolom1 danbaris1 adalahposisidariteks1 sedangkankolom2 danbaris2 adalahposisidariteks2. • Jika kita ingin menempatkan teks1 pada posisinya maka yang perlu dilakukan adalah • Memanggilfungsigotoxy() dengankolom1 danbaris1 sebagaiparameternya. • Kemudianmencetakteks1 gotoxy(kolom1, baris1); cout << teks1;
Overview • Hal yang samajugabisadilakukanuntukteks2. • Jikateks1 = ”ABC“ (tigakarakter/huruf) makaketigahuruftersebutakanmenempatiposisiberikut: • Contoh : kolom1 = 5 baris1 = 10
PenjelasanLanjut • Denganpengetahuantersebut, berikutiniakandijelaskanbagaimanacaranyamendeteksiterjadinyatabarakan: • Andaikanteks2 = “x“ (sebuahkarakter), berartijikakitamenggunakanperintahberikut : gotoxy(kolom2, baris2); cout << teks2; • makakarakter“x“ akanmenempatiposisikolom2 danbaris2. Dengandemikintabrakanakanterjadijikakondisiberikutterpenuhi : • baris2 = baris1 dan kolom2 = kolom1 (kolomhuruf A) atau • baris2 = baris1 dan kolom2 = kolom1 + 1 (kolomhuruf B) atau • baris2 = baris1 dan kolom2 = kolom1 + 2 (kolomhuruf C)
Jalankan Source Code Berikutdan Amati int main() { char tekan='X'; //kontrolarahgeraktulisan //kalau TRUE tulisanakanbergerakke KANAN (MAJU) //kalau FALSE tulisanakanbergerakke KIRI (MUNDUR) boolmaju = true; boolatas = true; //area animasi unsigned int BATASKANAN = 45; unsigned int BATASKIRI = 10; unsigned int BATASATAS = 11; unsigned int BATASBAWAH = 13; unsigned intkolom = 10; //kolomuntuktulisan "CPP" unsigned intbaris = 12; //barisuntuktulisan "CPP" unsigned int kolom2 = 26; //kolomuntuktulisan "X" unsigned int baris2 = 14; //barisuntuktulisan "X" unsigned inttabrak = 0; //teks yang akandicetak string teks = "CPP"; string teks2= "x"; gotoxy(10,4); cout << "========================================="; gotoxy(10,5); cout << "== Animasi - TeknikDeteksiTabrakan =="; gotoxy(10,8); cout << "========================================="; gotoxy(10,16); cout << " Tabrakan = 0 "; gotoxy(10,18); cout << " [ Tekan 'x' UntukKeluar ] "; #include<iostream> #include<windows.h> using namespace std; //variabel global untukmenyimpaninformasi //tombol yang ditekan INPUT_RECORD InRec; //fungsi delay(), digunakanuntukmenunda proses eksekusi //selamabeberapa millisecond #define delay Sleep //fungsigotoxy(), digunakanuntukmenempatkankursor //padaposisi KOLOM dan BARIS void gotoxy(unsigned intkolom, unsigned intbaris) { COORD posisi = {kolom,baris}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), posisi); } //fungsikbhit(), digunakanuntukmendeteksiterjadinya //penekanantombol. Jikaterdapattombol yang ditekanmakafungsiini //akanmengembalikannilai TRUE sebaliknya FALSE boolkbhit() { 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); } //fungsigetch(), digunakanuntukmengambilinformasitombol yang //terakhir kali ditekan. char getch() { return InRec.Event.KeyEvent.uChar.AsciiChar; }
{ baris2++; } } //deteksitabrakan 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; //cekapakahterjadipenekanantombol, //jika 'ya', simpantomboltersebutpadavariabel TEKAN if(kbhit()) tekan = getch(); delay(50); //HAPUS teks cout.width(teks.length()); //Cobadeh, tambahkantitik di antaratandakutipberikut //apa yang terjadi ? cout.fill(' '); //Diantaratandakutipberikut, akandiisidengan KARAKATER //yang ditentukanlewatfungsicout.fill(KARAKATER) diatas gotoxy(kolom,baris); cout<<""; //hapus teks2 gotoxy(kolom2,baris2); cout << " "; } } Jalankan Source Code Berikutdan Amati (lanjutan) //perulanganiniakandiulangselamatekan TIDAK SAMA dengan 'x' while(tekan!='x') { //kontrolposisiteks "CPP" if(maju==true) { //cobadeh, gantibagianinidengan 'kolom>=BATASKANAN' //apa yang terjadi ? if (kolom>=BATASKANAN-teks.length()) { maju=false; } else { kolom++; } } else { if (kolom<=BATASKIRI) { maju=true; } else { kolom--; } } //kontrolpoisiteks "x" if(atas==true) { if(baris2<=BATASATAS) { atas=false; } else { baris2--; } } else { if(baris2>=BATASBAWAH) { atas=true; } else
Contoh Game Sederhana • Contohdariimplementasi collision detection adalah game spacewar. Disiniakandicontohkan prototype game spacewarsederhanadengaNc++. • Untukbisamembuatgame ini, pengetahuan yang sudahdiperkenalkanpadapembahasansebelumnyasangatdibutuhkan • Sepertipengetahuanfungsi yang bisamengenalipenekanantombol PANAH danSPASI. • Untukitudibutuhkanmodifikasipadafungsikbhit() dangetch()
unsigned intgetch(boolkodeAscii=true) { if(kodeAscii==true) return InRec.Event.KeyEvent.uChar.AsciiChar; else return InRec.Event.KeyEvent.wVirtualKeyCode; } // DAFTAR TOMBOL //daftariniakanberlakujikakitamemanggilfungsigetch() //sepertiberikut : 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 mempunyaikode yang sama. Aturan yang samaberlaku //untukhuruf yang lain. //huruf A ... Z dimulaidari 65 .. 90 //angka 0 ... 9 dimulaidari 48 .. 57 const unsigned int HURUF_X = 88; int main() { gotoxy(10,4); cout << "==================================="; gotoxy(10,5); cout << "== Game SpacewareSederhana =="; 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' UntukKeluar ] "; unsigned inttekan='w'; //kontrolarahgeraktulisan //kalau TRUE tulisanakanbergerakke KANAN (MAJU) //kalau FALSE tulisanakanbergerakke KIRI (MUNDUR) boolmaju = true; //kalautombol SPASI ditekan, //variable iniakan di set TRUE booltembak = false; Jalankan Source Code Berikutdan Amati #include<iostream> #include<windows.h> using namespace std; //variabel global untukmenyimpaninformasi //tombol yang ditekan INPUT_RECORD InRec; //fungsi delay(), digunakanuntukmenunda proses eksekusi //selamabeberapa millisecond #define delay Sleep //fungsigotoxy(), digunakanuntukmenempatkankursor //padaposisi KOLOM dan BARIS void gotoxy(unsigned intkolom, unsigned intbaris) { COORD posisi = {kolom,baris}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), posisi); } //fungsikbhit(), digunakanuntukmendeteksiterjadinya //penekanantombol. Jikaterdapattombol yang ditekanmakafungsiini //akanmengembalikannilai TRUE sebaliknya FALSE boolkbhit() { 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; } //fungsigetch(), digunakanuntukmengambilinformasitombol yang //terakhir kali ditekan.
Jalankan Source Code Berikutdan Amati (lanjutan 1) //kontrolsenjata if(tekan == PANAH_KANAN) { //reset tomboltekan tekan=0; if (kolom1<BATASKANAN-senjata.length()) { kolom1++; kolom2 = kolom1; } gotoxy(30,19);cout<<"KANAN"; } else if(tekan==PANAH_KIRI) { //reset tomboltekan tekan=0; if (kolom1>BATASKIRI) { kolom1--; kolom2 = kolom1; } gotoxy(30,19);cout<<"KIRI "; } else if(tekan==SPASI) { tembak = true; tekan=0; baris2 = 17; } //area animasi unsigned int BATASKANAN = 45; unsigned int BATASKIRI = 10; unsigned int BATASATAS = 10; //Batas atasdarijalannya PELURU unsigned intkolom = 10; unsigned intbaris = 10; //kolomdari TARGET unsigned int kolom1 = 20; //barisdari TARGET unsigned int baris1 = 18; //kolomdari SENJATA unsigned int kolom2 = 20; //barisdari SENJATA unsigned int baris2 = 17; //kolomdari PELURU unsigned intkena = 0; //barisdari PELURU //teks yang akandicetak string target = "..0.."; string senjata = "^"; string peluru = "+"; //perulanganiniakandiulangselamatekan TIDAK SAMA dengan 'x' while(tekan!=HURUF_X) { //kontrolposisi if(maju==true) { //cobadeh, gantibagianinidengan 'kolom>=BATASKANAN' //apa yang terjadi ? if (kolom>=BATASKANAN-target.length()) { maju=false; } else { kolom++; } } else { if (kolom<=BATASKIRI) { maju=true; } else { kolom--; } }
Jalankan Source Code Berikutdan Amati (lanjutan 2) //cekapakahterjadipenekanantombol, //jika 'ya', simpantomboltersebutpadavariabel TEKAN if(kbhit()) tekan = getch(false); //cout << " " <<tekan<<" "; //Cekkodetombol yang ditekan, aktifkanbarisini. delay(50); //HAPUS teks cout.width(target.length()); //Cobadeh, tambahkantitik di antaratandakutipberikut //apa yang terjadi ? cout.fill(' '); //Diantaratandakutipberikut, akandiisidengan KARAKATER //yang ditentukanlewatfungsicout.fill(KARAKATER) diatas gotoxy(kolom,baris); cout<<""; //hapusposisi lama senjata gotoxy(kolom1,baris1); cout <<" "; //hapusposisi lama peluru if(tembak==true) { gotoxy(kolom2,baris2); cout <<" "; } } } //kontrolpeluru if(tembak==true) { if (baris2>BATASATAS) { //peluruselalubergerakkeatas. //iniberartibarisharusdikurangi baris2--; gotoxy(30,20);cout << " IYA "; } else { //ketikaposisipelurusudahmencapai BATASATAS //kitabisatembaklagi. tembak=false; //deteksitabrakan 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; //menampilkansenjata gotoxy(kolom1,baris1); cout << senjata; //menampilkanpeluru //hanyadilakukanjikakitamenembak if(tembak==true) { gotoxy(kolom2,baris2); cout << peluru; }
Percobaanlebihlanjut • Pahamimasing-masingfungsidanbaris programdankembangkanmenjadi game spacewaredenganmusuh yang lebihbanyak. • Jikasudahberhasil, cobaberikantembakanjugapadamusuh, jikamengenaipesawatlakon (^), kurangiskor/kena minus 1 (-1) • Analisadanjelaskanhasilpraktikumnya • Buatlaporan