Pertemuan 2

Report
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
Posisi
A
kolom1, baris1
B
kolom1 + 1, baris1
C
kolom1 + 2, baris1
• Contoh :
kolom1 = 5
baris1 = 10
Huruf
Posisi
A
5, 10
B
6+ 10
C
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<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)
//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++;
}
} 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
{
}
}
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 << " ";
}
}
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<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.
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;
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++;
}
} else
{
if (kolom<=BATASKIRI)
{
maju=true;
} else
{
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)
{
//reset tombol tekan
tekan=0;
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--;
//cek apakah terjadi penekanan tombol,
//jika 'ya', simpan tombol tersebut pada variabel TEKAN
if(kbhit()) tekan = getch(false);
gotoxy(30,20);cout << " IYA ";
} else
{
//ketika posisi peluru sudah mencapai BATASATAS
//kita bisa tembak lagi.
tembak=false;
//cout << " " <<tekan<<" "; //Cek kode tombol yang ditekan, aktifkan baris ini.
delay(50);
//HAPUS teks
cout.width(target.length());
//deteksi tabrakan PELURU & teks CPP
if(kolom2>=kolom && kolom2<=kolom+target.length()-1)
{
kena++;
gotoxy(30,21);cout << kena;
}
//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<<"";
gotoxy(30,20);cout << "TIDAK";
}
//hapus posisi lama senjata
gotoxy(kolom1,baris1); cout <<" ";
}
//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;
}
}
}
//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

similar documents