Selasa, 21 Juli 2015

Membuat Pesawat Fighter untuk Game Shoot Them Up

Membuat Pesawat Fighter (Tokoh Game) pada Game Shoot Them Up


Selamat pagi rekan-rekan sekalian, pada kesempatan kali ini ogut akan meneruskan obrolan tentang game Shoot Them Up. Sebelumnya ogut sudah pernah  membahas tentang cara membuat scrolling background, misil, direct sound dan sekarang ogut akan mengajarkan cara untuk membuat jagoan / tokoh game /  pesawat fighter.


Setiap game mempunyai tokoh atau jawara, dan setiap tokoh mempunyai karakteristik yang berbeda dengan tokoh yang lain.

Game Object
Untuk membuat tokoh yang berkarakteristik diperlukan struct untuk menampung nilai-nilai karakteristiknya. Struct yang ogut buat untuk tokoh di game ini adalah sebagai berikut.

typedef struct
{
int Object_Type;

double X1, Y1;
double X2, Y2;
double X3, Y3;
double X4, Y4;

int Index_Image;
int Delay_II;
int Counter_II;
int Max_II;

double X_Step;
double Y_Step;

double R_Degree;
double L_Degree;

int Power;
int Destruct;

char String_Movement[100];
int Index_M;
int Total_M;

char Object_Action[1];
int Max_OA;
int Counter_OA;

int Inside_Screen;
int Type_IS;

int Fire_Flag;
int Peluru;
int Missile_Flag;
int Missile;
int Bomb_Flag;
int Bomb;

int Score;

double StartTime;
double LifeTime;

}Game_Object;

Struct di atas tidaklah baku, rekan-rekan dapat mengubahnya sesuai dengan kebutuhan.

Karakteristik Pesawat
Setelah kita selesai membuat struct yang dipakai untuk menyimpan nilai-nilai karakteristik pesawat, langkah berikutnya adalah menentukan nilai-nilai karakteristik pesawat tersebut.

Object Type
Untuk pesawat ogut menentukan nilai Object Type=0.

Posisi
Posisi awal untuk pesawat ogut set dengan nilai X1=–100 dan Y1=–700, X2=100 dan Y2=–700, X3=100 dan Y3=–500,  terakhir X4=–100 dan Y4=–500. Jika Anda menginginkan pesawat dengan ukuran yang lebih besar, maka nilai delapan variabel di atas bisa diubah sesuai dengan kebutuhan. Tetapi harus diingat ukuran pesawat tidak boleh terlalu kecil karena akan berpengaruh pada proses deteksi tabrakan.

Texture
Empat buah variabel yang dipakai untuk menentukan texture pesawat di layar adalah: Index_Image=2, Delay_II=10, Counter_II=0 dan Max_II=6.
Index_Image=2 supaya pesawat memakai texture miring kekiri pada saat pertama kali ditampilkan di layar. Delay_II dan Counter_II dipakai untuk menentukan berapa kali looping sampai texture berikutnya dipakai (delay). Sedangkan Max_II=6 karena pesawat menggunakan enam texture.

Langkah pesawat
Nilai X_Step=7 dan Y_Step=7  dipakai untuk memindahkan posisi pesawat searah sumbu X dan Y.

Power
Power=2000, jika Anda ingin membuat  pesawat agar lebih sakti, Anda hanya tinggal memperbesar nilai Power.

Destruct
Nilai Destruct=100, dipakai untuk mengurangi Power musuh jika pesawat menabrak musuh.

Nilai-nilai karakteristik yang lain akan dijelaskan pada artikel lain.

Menampilkan Pesawat
Untuk menampilkan tokoh pesawat ke layar ogut menggunakan enam buah texture. Enam buah texture ini digunakan agar pesawat tampak lebih nyata berada di atas awan.



Texture no.3 dan no.5 sama, kedua texture digunakan sebanyak dua kali untuk memudahkan pemrograman pada saat menampilkan pesawat ke layar.

Pemrograman
Langkah terakhir yang harus dilakukan adalah pemrograman.

File teks
File teks digunakan untuk input nilai karakteristik pesawat. File teks ini dapat dibuat dengan menggunakan Notepad. Contoh karakteristik pesawat pada program ini ada pada folder Data_Object dengan nama file pesawat.txt.

Load
Nilai-nilai karakteristik pesawat ogut tempatkan pada sebuah array. Fungsi untuk loading nilai-nilai tersebut adalah.

bool Load_Game_Object(char *filename, Game_Object List_GO[])
{
int i = 0;

ifstream GO_Dat;
   
GO_Dat.open(filename);
 
if(!GO_Dat)
{
MessageBox(NULL, filename, "File Error!", MB_OK);
return false;
}

while(!GO_Dat.eof())
{
GO_Dat >> List_GO[i].Object_Type
>> List_GO[i].X1 >> List_GO[i].Y1
>> List_GO[i].X2 >> List_GO[i].Y2
>> List_GO[i].X3 >> List_GO[i].Y3
>> List_GO[i].X4 >> List_GO[i].Y4
>> List_GO[i].Index_Image
>> List_GO[i].Delay_II
>> List_GO[i].Counter_II
>> List_GO[i].Max_II
>> List_GO[i].X_Step
>> List_GO[i].Y_Step
>> List_GO[i].R_Degree
>> List_GO[i].L_Degree
>> List_GO[i].Power
>> List_GO[i].Destruct
>> List_GO[i].String_Movement
>> List_GO[i].Index_M
>> List_GO[i].Total_M
>> List_GO[i].Object_Action
>> List_GO[i].Max_OA
>> List_GO[i].Counter_OA
>> List_GO[i].Inside_Screen
>> List_GO[i].Type_IS
>> List_GO[i].Fire_Flag
>> List_GO[i].Peluru
>> List_GO[i].Missile_Flag
>> List_GO[i].Missile
>> List_GO[i].Bomb_Flag
>> List_GO[i].Bomb
>> List_GO[i].Score
>> List_GO[i].StartTime
>> List_GO[i].LifeTime;

//Total_M dihitung karena tergantung
//dari banyaknya String_Movement
List_GO[i].Total_M = strlen(List_GO[i].String_Movement) / 4;
i++;
}

return true;
}

Display pesawat
Fungsi untuk menampilkan pesawat ke layar monitor adalah.

void Display_Pesawat(int &ktk_p, unsigned int image_object[], unsigned int mask_object[])
{
//jika power pesawat=0
//berarti pesawat musnah/mati
if (Pesawat[0].Power != 0)
{
Pesawat[0].Counter_II++;

//jika pesawat tidak belok kiri atau kanan
//maka pesawat dibuat supaya
//miring kiri atau kanan

//ktk_p=2 menunjukan pesawat tidak
//belok kiri atau kanan
if (ktk_p == 2)
{
if (Pesawat[0].Counter_II > Pesawat[0].Delay_II)
{
Pesawat[0].Index_Image++;
Pesawat[0].Counter_II = 0;
}

//nilai Max_II = 6
if (Pesawat[0].Index_Image == Pesawat[0].Max_II)
Pesawat[0].Index_Image = 2;

ktk_p = Pesawat[0].Index_Image;
}

//display pesawat
//dengan tehnik masking
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR, GL_ZERO);

glBindTexture(GL_TEXTURE_2D, mask_object[ktk_p]);
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 0.0);
glVertex2d( Pesawat[0].X1, Pesawat[0].Y1);

glTexCoord2d(1.0, 0.0);
glVertex2d( Pesawat[0].X2, Pesawat[0].Y2);

glTexCoord2d(1.0, 1.0);
glVertex2d( Pesawat[0].X3, Pesawat[0].Y3);

glTexCoord2d(0.0, 1.0);
glVertex2d( Pesawat[0].X4, Pesawat[0].Y4);
glEnd();

glBlendFunc(GL_ONE, GL_ONE);

glBindTexture(GL_TEXTURE_2D, image_object[ktk_p]);
glBegin(GL_POLYGON);
glTexCoord2d(0.0, 0.0);
glVertex2d( Pesawat[0].X1, Pesawat[0].Y1);

glTexCoord2d(1.0, 0.0);
glVertex2d( Pesawat[0].X2, Pesawat[0].Y2);

glTexCoord2d(1.0, 1.0);
glVertex2d( Pesawat[0].X3, Pesawat[0].Y3);

glTexCoord2d(0.0, 1.0);
glVertex2d( Pesawat[0].X4, Pesawat[0].Y4);
glEnd();

glDisable(GL_BLEND);

// kembalikan image
ktk_p = 2;
}
}

Keyboard
Untuk membuat pesawat bergerak di layar maka diperlukan fungsi GetKeyState().

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

//pesawat ke kanan
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;
}

//set ktk=1 agar texture pesawat
//memakai texture belok kanan
ktk = 1;
}

//pesawat ke kiri
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;
}

//set ktk=0 agar texture pesawat
//memakai texture belok kiri
ktk = 0;
}

//pesawat ke depan
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;
}
}

//pesawat ke belakang
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;
}
}
}

Selesai dah pembahasan cara membuat tokoh game /  pesawat jagoan, di artikel selanjutnya ogut akan membahas cara untuk menembak dan cara untuk mendeteksi tabrakan serta teknik-teknik lainnya yang terkait, sehingga rekan-rekan dapat belajar untuk membuat game sejenis ini.

Selamat Belajar


Heriady
heriady.yoh@gmail.com




Artikel terkait

Panduan Lengkap Membuat Game Perang Shoot Them Up

Contoh Program Direct Sound

Manfaat Sudut Vektor Untuk Missile

Membuat Musuh / Lawan Tanding

Tidak ada komentar:

Posting Komentar