Sabtu, 18 Juli 2015

Membuat Missile

Pagi hari di Hari Raya Lebaran kedua...


Selamat pagi semuanya, Selamat Lebaran untuk rekan-rekan sekalian dan mohon maaf lahir batin. Di pagi hari ini ogut akan memberikan cerita tentang sudut vektor kembali, ya manfaat sudut vektor untuk diterapkan pada pemrograman game.

Update 1 Jan 2016 (Happy New Year 2016)



Kali ini ogut akan memberikan contoh program misil, proses pembuatan misil cukup rumit karena sifat dari misil yang dilepas oleh musuh selalu mengejar pesawat, sehingga kemanapun pesawat lari akan tetap dikejar oleh misil.


Vektor Arah
Untuk membuat misil agar tetap mengejar pesawat ogut menggunakan vektor untuk menyelesaikan perhitungannya.


Pada gambar di atas terlihat dua buah objek yaitu misil dan pesawat. Dari polygon misil kita buat tiga buah vektor, vektor arah, vektor kiri, dan vektor kanan. Lalu dari misil ke pesawat kita buat satu buah vektor yang kita beri nama vektor pesawat. Jika sudut Ө˚ antara vektor arah dan vektor pesawat lebih kecil dari 30˚, maka arah dari misil tak perlu diubah, karena misil sudah mengarah ke pesawat, jika tidak maka arah dari misil harus diubah supaya tetap mengejar pesawat. Untuk mengubah arah misil ogut menggunakan vektor kiri atau vektor kanan.


Jika Ө1˚ lebih kecil dari Ө2˚ maka misil perlu dirotasi ke arah kiri agar kepala dari misil mengarah ke pesawat, demikian juga untuk sebaliknya.

String Movement Untuk Misil
Setelah arah misil mengarah kepada pesawat maka misil harus dipindahkan posisinya agar terus mendekati pesawat. Untuk mengisi String_Movement (klik disini untuk artikel String Movement) misil diperlukan dua buah vektor yaitu vektor x dan vektor y sebagai alat bantu.


Ө1˚ adalah sudut yang dibentuk antara vektor arah dan vektor y, sedangkan Ө2˚ adalah sudut antara vektor arah dan vektor x. Dengan kondisi seperti gambar di atas maka berlaku.


Melepas Misil
Untuk meluncurkan misil ogut menggunakan huruf ‘X’. sehingga String_Movement dari objek (pesawat musuh / Big Boss) yang melepas misil harus disisipkan huruf ‘X’.

//dengan menambahkan X pada String_Movement
//object bisa melepas misil untuk mengejar pesawat
strcpy_s(Big_Boss[0].String_Movement,"X001F070F070F060D070D070D060B070B070B060H070H070H060");

Yang sangat berbeda pada pemrograman misil adalah cara agar misil tetap mengejar pesawat dalam keadaan apapun.

void Update_String_M_Missile(Game_Object &Missile_p, Game_Object My_Object)
{
Vektor2D Vektor_Arah;
Vektor2D Vektor_kiri90, Vektor_kanan90;
Vektor2D Vektor_P, V_tengah;
double Xtengah_P, Ytengah_P;
double Xtengah_M, Ytengah_M;
double teta; 
double teta_1, teta_2;

Vektor2D Vektor_X, Vektor_Y;

//toleransi berguna karena
//perhitungan sudut tidak selalu 
//bilangan bulat
double toleransi = 2.0;

double min_toleransi1, max_toleransi1;
double min_toleransi2, max_toleransi2;


if (Missile_p.Power == 0)
return;

//pada saat awal misil dilepas 
//misil harus bergerak menjauh
//dari object yang melepas misil
//hal ini dilakukan agar menghasilkan 
//animasi yang lebih baik
if ((Missile_p.Max_OA == 999) && (Missile_p.Counter_OA < 30))
return;

//////////////////////////////////////////
//hitung sudut arah missile dengan pesawat
//////////////////////////////////////////
//cari titik tengah pesawat
V_tengah = Vektor_dari_2_Vertex(My_Object.X3, My_Object.Y3, 
My_Object.X1, My_Object.Y1);

V_tengah = Vektor_diskala(0.5, V_tengah);

Xtengah_P = V_tengah.i + My_Object.X1;
Ytengah_P = V_tengah.j + My_Object.Y1;

//cari titik tengah missile
V_tengah = Vektor_dari_2_Vertex(Missile_p.X3, Missile_p.Y3, 
Missile_p.X1, Missile_p.Y1);

V_tengah = Vektor_diskala(0.5, V_tengah);

Xtengah_M = V_tengah.i + Missile_p.X1;
Ytengah_M = V_tengah.j + Missile_p.Y1;

//create vektor pesawat
Vektor_P = Vektor_dari_2_Vertex(Xtengah_P, Ytengah_P, 
Xtengah_M, Ytengah_M);

//create vektor arah
Vektor_Arah = Vektor_dari_2_Vertex(Missile_p.X1, Missile_p.Y1, 
Missile_p.X4, Missile_p.Y4);

//hitung sudut antara misil dan pesawat
teta =  Sudut_2_Vektor(Vektor_Arah, Vektor_P);


//jika sudut lebih kecil dari 30 derajat
//maka arah misil tidak perlu di rotasi
//karena sudah mengarah ke pesawat
if (teta > 30.0)
{
//untuk tentukan arah missile ke kiri atau ke kanan

//create vektor kiri dan vektor kanan
Vektor_kiri90 = Vektor_dari_2_Vertex(Missile_p.X3, Missile_p.Y3, 
Missile_p.X4, Missile_p.Y4);

Vektor_kanan90 = Vektor_dari_2_Vertex(Missile_p.X4, Missile_p.Y4, 
Missile_p.X3, Missile_p.Y3);

teta_1 = Sudut_2_Vektor(Vektor_kiri90, Vektor_P);
teta_2 = Sudut_2_Vektor(Vektor_kanan90, Vektor_P);

Missile_p.Counter_OA = 0;

if (teta_1 < teta_2)
//misil di rotasi ke kiri
strcpy_s(Missile_p.String_Movement, "L001");
else
//misil di rotasi ke kanan
strcpy_s(Missile_p.String_Movement, "R001");

return;
}

//jika sudut antara missile dan pesawat sudah tepat
//tentukan arah missile untuk update String_Movement

//create vektor x dan vektor y
Vektor_X = Vektor_dari_2_Vertex(100.0, 0.0, 0.0, 0.0);
Vektor_Y = Vektor_dari_2_Vertex(0.0, 100.0, 0.0, 0.0);

teta_1 =  Sudut_2_Vektor(Vektor_Arah, Vektor_Y);
teta_2 =  Sudut_2_Vektor(Vektor_Arah, Vektor_X);

min_toleransi1 = teta_1 - toleransi;
max_toleransi1 = teta_1 + toleransi;

min_toleransi2 = teta_2 - toleransi;
max_toleransi2 = teta_2 + toleransi;

Missile_p.Counter_OA = 0;

if ((min_toleransi1 <= 0.0) && (max_toleransi1 >= 0.0))
strcpy_s(Missile_p.String_Movement, "A001");

if ((min_toleransi1 <= 180.0) && (max_toleransi1 >= 180.0))
strcpy_s(Missile_p.String_Movement, "E001");

if ((min_toleransi2 <= 0.0) && (max_toleransi2 >= 0.0))
strcpy_s(Missile_p.String_Movement, "C001");

if ((min_toleransi2 <= 180.0) && (max_toleransi2 >= 180.0))
strcpy_s(Missile_p.String_Movement, "G001");

if ((min_toleransi1 <= 45.0) && 
(max_toleransi1 >= 45.0) &&
(min_toleransi2 <= 45.0) && 
(max_toleransi2 >= 45.0))
strcpy_s(Missile_p.String_Movement, "B001");

if ((min_toleransi1 <= 135.0) && 
(max_toleransi1 >= 135.0) &&
(min_toleransi2 <= 45.0) && 
(max_toleransi2 >= 45.0))
strcpy_s(Missile_p.String_Movement, "D001");

if ((min_toleransi1 <= 135.0) && 
(max_toleransi1 >= 135.0) &&
(min_toleransi2 <= 135.0) && 
(max_toleransi2 >= 135.0))
strcpy_s(Missile_p.String_Movement, "F001");

if ((min_toleransi1 <= 45.0) && 
(max_toleransi1 >= 45.0) &&
(min_toleransi2 <= 135.0) && 
(max_toleransi2 >= 135.0))
strcpy_s(Missile_p.String_Movement, "H001");
}

Update 1  Jan 2016

Artikel lain yang idenya hampir sama dengan missile adalah sudut vektor, seperti contoh program berikut ini.


Demikianlah teman-teman dan rekan-rekan sekalian, ide untuk membuat misil di game dengan menggunakan matematika vektor. Sederhana bukan? Sampai jumpa lagi di artikel yang lain.

Salam


Heriady
heriady.yoh@gmail.com




Tidak ada komentar:

Posting Komentar