Transcript Pertemuan 2

Workshop Project 2

Collision Detection

Mohammad Zikky, S.ST, M.T

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 1. Memanggil fungsi gotoxy() dengan kolom1 dan baris1 sebagai parameternya.

2. 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:

Huruf

A B C •

Contoh :

kolom1 = 5 baris1 = 10

Huruf

A B C

Posisi

kolom1, baris1 kolom1 + 1, baris1 kolom1 + 2, baris1

Posisi

5, 10 6+ 10 7+ 10

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 : 1. baris2 = baris1 dan kolom2 = kolom1 (kolom huruf A) atau 2. baris2 = baris1 dan kolom2 = kolom1 + 1 (kolom huruf B) atau 3. baris2 = baris1 dan kolom2 = kolom1 + 2 (kolom huruf C)

Jalankan Source Code Berikut dan Amati

#include #include 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)

//perulangan ini akan diulang selama tekan TIDAK SAMA dengan 'x' while(tekan!='x') { { baris2++; } } //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++; { } } else if (kolom<=BATASKIRI) { { maju=true; } else kolom--; } } //kontrol poisi teks "x" if(atas==true) { if(baris2<=BATASATAS) { { atas=false; } else baris2--; { } } else if(baris2>=BATASBAWAH) { atas=true; } else } } //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 << " ";

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

#include #include using namespace std; //variabel global untuk menyimpan informasi //tombol yang ditekan INPUT_RECORD InRec; unsigned int getch(bool kodeAscii=true) { if(kodeAscii==true) return InRec.Event.KeyEvent.uChar.AsciiChar; else return InRec.Event.KeyEvent.wVirtualKeyCode; } //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; } // 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; //fungsi getch(), digunakan untuk mengambil informasi tombol yang //terakhir kali ditekan.

//kalau tombol SPASI ditekan, //variable ini akan di set TRUE bool tembak = false;

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 //kontrol senjata if(tekan == PANAH_KANAN) { //reset tombol tekan tekan=0; //teks yang akan dicetak string target = "..0.."; string senjata = "^"; string peluru = "+"; if (kolom1=BATASKANAN' //apa yang terjadi ?

if (kolom>=BATASKANAN-target.length()) { { maju=false; } else kolom++; { } } else if (kolom<=BATASKIRI) { { maju=true; } else kolom--; } } if (kolom1>BATASKIRI) { kolom1--; kolom2 = kolom1; } gotoxy(30,19);cout<<"KIRI "; } else if(tekan==SPASI) { tembak = true; tekan=0; 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 if(tembak==true) { gotoxy(kolom2,baris2); cout << peluru; } } //cek apakah terjadi penekanan tombol, //jika 'ya', simpan tombol tersebut pada variabel TEKAN if(kbhit()) tekan = getch(false); //cout << " " <

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