Kamis, 23 Juli 2015

Membuat Peluru untuk Game Shoot Them Up

Membuat Peluru Pesawat dan Peluru Musuh Agar Mereka Bisa Saling Baku Tembak


Selamat Pagi sobat-sobat sekalian, salam sejahterah selalu, pagi ini ogut akan meneruskan obrolan tentang game shoot them up. Setelah sebelumnya kita belajar cara membuat pesawat fighter dan musuh-musuhnya, bagian berikutnya yang harus kita buat pada game Shoot Them Up adalah mempersenjatai pesawat dan musuh-musuhnya agar bisa berperang. Untuk itu ogut membagi arikel ini  menjadi dua bagian, satu untuk membahas pembuatan peluru pesawat dan berikutnya membuat peluru musuh, tetapi program contohnya ogut gabung menjadi satu.


Peluru Pesawat
Cara membuat peluru tidak berbeda dengan cara membuat pesawat, yang perlu diperhatikan adalah peluru dipicu oleh user dengan cara menekan keyboard dan posisi peluru ditentukan oleh posisi pesawat pada saat pesawat melepaskan peluru.

Karakteristik peluru pesawat yang harus diperhatikan adalah nilai dari Type_IS=0, dan nilai Destruct dari peluru yang dapat menentukan kekuatan peluru untuk memusnahkan musuh.

Langkah-langkah untuk membuat peluru pesawat sebagai berikut:

File teks
Membuat file teks untuk menampung nilai-nilai karakteristik peluru.

Load
Loading data dari file teks  ke array.

Keyboard
Tombol keyboard yang digunakan untuk memicu peluru adalah  ‘V’, untuk itu fungsi GetKeyState() harus ditambahkan ke fungsi keyboard yang sebelumnya telah kita buat.

void Keyboard_ditekan()
{

if(GetKeyState(VK_ESCAPE) & 0x80)
{
selesai = true;
}

if((GetKeyState('F') & 0x80) || (GetKeyState('L') & 0x80))
{

if ((Pesawat[0].X2) < Xmax)
{
Pesawat[0].X1 += Pesawat[0].X_Step;
Pesawat[0].X2 += Pesawat[0].X_Step;
Pesawat[0].X3 += Pesawat[0].X_Step;
Pesawat[0].X4 += Pesawat[0].X_Step;
}

ktk = 1;
}

if((GetKeyState('S') & 0x80) || (GetKeyState('J') & 0x80))
{
if ((Pesawat[0].X1) > -Xmax)
{
Pesawat[0].X1 -= Pesawat[0].X_Step;
Pesawat[0].X2 -= Pesawat[0].X_Step;
Pesawat[0].X3 -= Pesawat[0].X_Step;
Pesawat[0].X4 -= Pesawat[0].X_Step;
}

ktk = 0;
}

if((GetKeyState('E') & 0x80) || (GetKeyState('I') & 0x80))
{
if ((Pesawat[0].Y4) < Ymax)
{
Pesawat[0].Y1 += Pesawat[0].Y_Step;
Pesawat[0].Y2 += Pesawat[0].Y_Step;
Pesawat[0].Y3 += Pesawat[0].Y_Step;
Pesawat[0].Y4 += Pesawat[0].Y_Step;
}
}

if((GetKeyState('D') & 0x80) || (GetKeyState('K') & 0x80))
{
if ((Pesawat[0].Y2) > -Ymax)
{
Pesawat[0].Y1 -= Pesawat[0].Y_Step;
Pesawat[0].Y2 -= Pesawat[0].Y_Step;
Pesawat[0].Y3 -= Pesawat[0].Y_Step;
Pesawat[0].Y4 -= Pesawat[0].Y_Step;
}
}


//tombol V untuk pemicu peluru pesawat
delay_peluru_pesawat++;

if(GetKeyState('V') & 0x80)
{

if (Pesawat[0].Power != 0)
{
if (delay_peluru_pesawat >= 12)
{
delay_peluru_pesawat = 0;

//aktifkan peluru pesawat
Pesawat_Fire(Peluru_Regular, total_peluru, Pesawat[0]);

SoundEffect[1].Play(false);
}
}
}
}

Mengaktifkan peluru
Pada saat user menekan tombol ‘V’ peluru perlu diaktifkan dengan cara mengisi variabel Power lebih besar dari 0(nol).

void Pesawat_Fire(Game_Object Peluru_p[], int tot_peluru_p, Game_Object Pesawat_p)
{
int i;
for (i = 0; i < tot_peluru_p; i++)
{
if (Peluru_p[i].Power == 0)
{
//set power = 100, agar peluru aktif
Peluru_p[i].Power = 100;
//menentukan posisi awal peluru

//posisi awal peluru ditentukan oleh
//posisi pesawat, pada saat pesawat 
//melepaskan peluru
Peluru_p[i].X1 = Pesawat_p.X1 + 80.0;
Peluru_p[i].X2 = Pesawat_p.X2 - 80.0;
Peluru_p[i].X3 = Pesawat_p.X3 - 80.0;
Peluru_p[i].X4 = Pesawat_p.X4 + 80.0;

Peluru_p[i].Y1 = Pesawat_p.Y1 + 80.0;
Peluru_p[i].Y2 = Pesawat_p.Y2 + 80.0;
Peluru_p[i].Y3 = Pesawat_p.Y3 - 80.0;
Peluru_p[i].Y4 = Pesawat_p.Y4 - 80.0;

Peluru_p[i].Inside_Screen = 1;

i = tot_peluru_p;
}
}
}

Peluru digerakkan (Move the object)
Fungsi yang ogut pakai untuk memposisikan  peluru di layar sama dengan fungsi yang dipakai untuk menggerakkan musuh.

Menentukan posisi peluru di dalam atau di luar layar
Tidak seperti musuh, jika berada di luar layar masih tetap aktif. Peluru jika telah berada di luar layar maka harus mati (Power=0), untuk itu perlu diperiksa kondisi posisi dari peluru tersebut.

Tampilkan peluru
Fungsi untuk menampilkan peluru sedikit berbeda dengan fungsi untuk menampilkan pesawat, karena peluru hanya memerlukan satu texture saja.

void Display_Peluru(Game_Object &My_Object, unsigned int image_object[], unsigned int mask_object[])
{
//peluru yang ditampilkan jika
//Power > 0 dan berada di dalam layar
if ((My_Object.Power != 0) && (My_Object.Inside_Screen == 1))
{

glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR, GL_ZERO);

glBindTexture(GL_TEXTURE_2D, mask_object[My_Object.Index_Image]);
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 0.0);
glVertex2d( My_Object.X1, My_Object.Y1);

glTexCoord2d(1.0, 0.0);
glVertex2d( My_Object.X2, My_Object.Y2);

glTexCoord2d(1.0, 1.0);
glVertex2d( My_Object.X3, My_Object.Y3);

glTexCoord2d(0.0, 1.0);
glVertex2d( My_Object.X4, My_Object.Y4);
glEnd();


glBlendFunc(GL_ONE, GL_ONE);

glBindTexture(GL_TEXTURE_2D, image_object[My_Object.Index_Image]);
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 0.0);
glVertex2d( My_Object.X1, My_Object.Y1);

glTexCoord2d(1.0, 0.0);
glVertex2d( My_Object.X2, My_Object.Y2);

glTexCoord2d(1.0, 1.0);
glVertex2d( My_Object.X3, My_Object.Y3);

glTexCoord2d(0.0, 1.0);
glVertex2d( My_Object.X4, My_Object.Y4);
glEnd();

glDisable(GL_BLEND);
}
}

Peluru Musuh
Bila peluru pesawat dipicu oleh tombol space, peluru musuh harus diprogram agar bisa menembak sesuai dengan kehendak kita.  Untuk melepaskan peluru penulis menggunakan karakter “Z”, sebagai contoh String_Movement=”Z002” berarti musuh melepaskan peluru sebanyak dua buah, sedangkan Fire_Flag=1 menandakan musuh sedang menembak.

Langkah-langkah untuk membuat peluru musuh adalah:

File teks
Pada saat membuat file ini perhatikan nilai untuk variabel String_Movement dengan menyisipkan “Z” untuk membuat musuh menembak.

Load
Sama dengan peluru pesawat

Program musuh agar menembak
Tambahkan fungsi di bawah agar peluru musuh bisa ditembakkan

void Move_The_Object(Game_Object &My_Object)
{

...
...
...
//set musuh agar menembak
if (strcmp(My_Object.Object_Action,"Z") == 0)
Object_Fire(My_Object);
...
...
...

}

//Z
void Object_Fire(Game_Object &My_Object)
{
My_Object.Fire_Flag = 1;
}

Aktifkan peluru musuh
Cara mengaktifkan peluru musuh adalah dengan cara mengisi Power lebih besar dari 0(nol).

void Enemy_Fire(Game_Object musuh, Game_Object Peluru_enemy_p[], int tot_peluru_e)
{
int i;
Vektor2D V_tengah;
double Xtengah, Ytengah;
double delta_XY = 20.0;

int counter_fire = 0;
for (i = 0; i < tot_peluru_e; i++)
{
if (Peluru_enemy_p[i].Power == 0)
{
Peluru_enemy_p[i].Power = Peluru_enemy_p[i].Destruct;

//cari titik tengah musuh dengan vektor

V_tengah = Vektor_dari_2_Vertex(musuh.X3, musuh.Y3, musuh.X1, musuh.Y1);
V_tengah = Vektor_diskala(0.5, V_tengah);

Xtengah = V_tengah.i + musuh.X1;
Ytengah = V_tengah.j + musuh.Y1;

//set posisi awal peluru musuh pada
//saat ditembakkan
Peluru_enemy_p[i].X1 = Xtengah - delta_XY;
Peluru_enemy_p[i].X2 = Xtengah + delta_XY;
Peluru_enemy_p[i].X3 = Xtengah + delta_XY;
Peluru_enemy_p[i].X4 = Xtengah - delta_XY;

Peluru_enemy_p[i].Y1 = Ytengah - delta_XY;
Peluru_enemy_p[i].Y2 = Ytengah - delta_XY;
Peluru_enemy_p[i].Y3 = Ytengah + delta_XY;
Peluru_enemy_p[i].Y4 = Ytengah + delta_XY;

Peluru_enemy_p[i].Inside_Screen = 1;
Peluru_enemy_p[i].Type_IS = 0;

counter_fire++;
}

if (counter_fire == musuh.Max_OA)
return;
}
}

Peluru digerakkan(Move the object)
Sama dengan peluru pesawat

Menentukan posisi peluru di dalam atau di luar layar
Sama dengan peluru pesawat

Tampilkan peluru
Sama dengan peluru pesawat

Selesai pembahasan tentang peluru, sampai jumpa lagi di artikel  yang lain, di kesempatan lain ogut akan membahas cara mendeteksi tabrakan antara peluru dan pesawat serta musuh, cara membuat bomb dan lain-lain.

Selamat Belajar, salam sukses selalu untuk rekan-rekan


Heriady
heriady.yoh@gmail.com