Rabu, 19 Agustus 2015

Membuat Musuh dan Bonus dengan Game Engine

Membuat musuh sebagai lawan tanding pemain game / user dan membuat bonus dengan game engine


Selamat pagi rekan-rekan semua dan salam sukses luar biasa, meneruskan artikel sebelumnya tentang game engine, kali ini ogut akan membahas tentang cara membuat musuh dan bonus di game engine yang ogut buat sendiri. Pemrograman di game engine ini sangat mudah rekan-rekan, hanya dengan satu atau dua baris kode program saja (MainProgram.cpp), maka musuh dan bonus akan tampil.


Gerakan Dasar Musuh dan Bonus
Artikel untuk cara membuat musuh dan bonus ogut jadikan satu, demikian juga pada program di game engine ini, musuh dan bonus mempunyai banyak persamaan dari segi karakter dan dari segi pemrograman sehingga lebih tepat dan mudah dijadikan dalam satu kesatuan.

Salah satu hal terpenting dan tersulit pada proses pembuatan musuh atau bonus adalah membuat gerakan musuh atau bonus pada saat tampil di layar monitor.


Untuk membuat musuh atau bonus bergerak ogut memakai arah seperti gambar di atas. Jika rekan-rekan menghendaki sebuah musuh atau bonus bergerak ke kanan lalu ke kiri secara terus menerus maka Anda harus mengisi nilai gerakan musuh atau bonus dengan “C050G050”.

“C050G050” jika diartikan akan berbunyi seperti berikut bergerak ke kanan(C) sebanyak  50 langkah lalu ke kiri(G) sebanyak 50 langkah.

Disamping delapan arah gerakan ogut juga menyediakan sebuah gerakan(I) agar musuh atau bonus diam ditempat.

Dengan menggunakan sembilan huruf di atas Anda dapat membuat variasi gerakan untuk musuh dan bonus.

Menampilkan Musuh dan Bonus
Untuk menampilkan musuh dan bonus ke layar monitor hanya satu fungsi yang perlu ditambahkan ke dalam program yaitu geDisplayEnemy.

#include"My7OpenGL.h"
#include"GEEmas7.h"

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

/////////////////////////////
//Fungsi utama
/////////////////////////////
int WINAPI WinMain(HINSTANCE HInstanceP, 
HINSTANCE HPrevinstanceP, 
LPSTR LpcmdLineP, int NShowcmdP)
{
GameOpenGL.SetHInstance(HInstanceP);
if (!GameOpenGL.CreateOpenGLWindow(MainHWND))
return 0;

if (!GameObject.geInisialisasi(MainHWND))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameOpenGL.DisplayLoading();

GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

while (GameOpenGL.OpenGLMainLoop)
    {
GameOpenGL.MessageHandle();

/////////////////////////////
//Render objek game, 
//di bawah ini
/////////////////////////////

GameObject.geDisplayBG();

/////////////////////////////
//Musuh dan bonus
/////////////////////////////
GameObject.geDisplayEnemy(); 

GameObject.geDisplayJackFighter();


/////////////////////////////
GameOpenGL.OpenGLSwapBuffer(); 
GameOpenGL.BreakProgram(); 

GameObject.geTimerGEEmas7(GAME_DELAY); 

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Musuh akan tampil dalam tiga warna secara acak, musuh harus dimusnahkan dengan segera, dan jika musuh menembak arahnya selalu tepat ke bagian tubuh Jack Fighter.

Bonus tidak boleh ditabrak oleh pesawat Jack Fighter, tetapi harus ditembak hingga berubah menjadi huruf A atau P. Setelah bonus berubah menjadi huruf pesawat Jack Fighter diperbolehkan menabrak bonus.


Fungsi geDisplayEnemy harus ditempatkan setelah geDisplayBG dan sebelum geDisplayJackFighter, jika program Anda jalankan maka akan menghasilkan tampilan seperti pada gambar di atas dan program ini hanya bisa dihentikan(break) dengan menekan tombol Esc.

Mengganti Tekstur Musuh dan Bonus
Sama seperti tokoh utama Jack Fighter,  tekstur untuk musuh dan bonus bisa Anda ganti dengan fungsi geLoadEnemyTexture dan geLoadBonusTexture. Kedua fungsi ini harus ditempatkan sebelum while.

#include"My7OpenGL.h"
#include"GEEmas7.h"

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

/////////////////////////////
//Fungsi utama
/////////////////////////////
int WINAPI WinMain(HINSTANCE HInstanceP,
HINSTANCE HPrevinstanceP,
LPSTR LpcmdLineP, int NShowcmdP)
{
GameOpenGL.SetHInstance(HInstanceP);
if (!GameOpenGL.CreateOpenGLWindow(MainHWND))
return 0;

if (!GameObject.geInisialisasi(MainHWND))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameOpenGL.DisplayLoading();

/////////////////////////////
//Load musuh tekstur
/////////////////////////////
if (!GameObject.geLoadEnemyTexture(
"Enemy1/gkiri.bmp", 
"Enemy1/tengah.bmp", 
"Enemy1/gkanan.bmp"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

/////////////////////////////
//Load bonus tekstur
/////////////////////////////
if (!GameObject.geLoadBonusTexture(
"Bonus1/gkiri.bmp", 
"Bonus1/tengah.bmp", 
"Bonus1/gkanan.bmp"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}


GameObject.gePlayRandomSoundBG();
GameObject.geSetGameLoop();
while (GameOpenGL.OpenGLMainLoop)
    {
GameOpenGL.MessageHandle();

/////////////////////////////
//Render objek game,
//di bawah ini
/////////////////////////////

GameObject.geDisplayBG();

/////////////////////////////
//Musuh dan bonus
/////////////////////////////
GameObject.geDisplayEnemy();

GameObject.geDisplayJackFighter();


/////////////////////////////
GameOpenGL.OpenGLSwapBuffer();
GameOpenGL.BreakProgram();

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Pembuatan tekstur untuk kedua objek ini sama dengan pembuatan tekstur untuk Jack Fighter, hanya terdapat dua perbedaan, pertama posisi dari pesawat menghadap kanan atau hidung pesawat berada di sebelah kanan, kedua tekstur hanya berjumlah tiga buah.

Goyang Kiri

Tengah

Goyang Kanan

Hasil jika program di atas dijalankan adalah sebagai berikut.


Menampilkan Koordinat dan Waktu
Sebelum ogut membahas tentang cara membuat variasi musuh dan bonus ada satu hal kecil yang harus ogut jelaskan terlebih dahulu, yaitu fungsi geDisplayPosisiScreen.

#include"My7OpenGL.h"
#include"GEEmas7.h"

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

/////////////////////////////
//Fungsi utama
/////////////////////////////
int WINAPI WinMain(HINSTANCE HInstanceP, 
HINSTANCE HPrevinstanceP, 
LPSTR LpcmdLineP, int NShowcmdP)
{
GameOpenGL.SetHInstance(HInstanceP);
if (!GameOpenGL.CreateOpenGLWindow(MainHWND))
return 0;

if (!GameObject.geInisialisasi(MainHWND))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameOpenGL.DisplayLoading();
GameObject.gePlayRandomSoundBG();

/////////////////////////////
//Posisi screen ditampilkan
/////////////////////////////
GameObject.geDisplayPosisiScreen(); 

GameObject.geSetGameLoop();

while (GameOpenGL.OpenGLMainLoop)
    {
GameOpenGL.MessageHandle();

/////////////////////////////
//Render objek game, 
//di bawah ini
/////////////////////////////

GameObject.geDisplayBG();

/////////////////////////////
//Musuh dan bonus
/////////////////////////////
GameObject.geDisplayEnemy(); 

GameObject.geDisplayJackFighter();

/////////////////////////////
GameOpenGL.OpenGLSwapBuffer(); 
GameOpenGL.BreakProgram(); 

GameObject.geTimerGEEmas7(GAME_DELAY); 

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Hasil dari listing program di atas akan tampak seperti pada gambar di bawah.


Pada gambar di atas tampak gambar jaring-jaring  yang merupakan titik koordinat dengan skala 100 satuan, serta angka yang terus menerus bertambah secara berurutan.

Jaring atau jala di atas berguna untuk membantu rekan-rekan dalam menempatkan posisi musuh atau bonus, dan angka yang terus bertambah adalah waktu untuk mengakifkan musuh atau bonus.

Jika Anda mengisi nilai waktu aktif sebuah musuh dengan nilai 19, maka musuh akan mulai bergerak di layar monitor pada saat waktu berada pada angka 19. Dengan menggunakan waktu ini rekan-rekan bisa mengatur kapan waktu musuh dan bonus tampil di layar.

Membuat Variasi Musuh dan Bonus
Untuk membuat musuh dan bonus yang bervariasi Anda memerlukan dua buah file teks yang akan dipakai untuk menyimpan daftar musuh dan daftar bonus.

Hal-hal penting yang harus Anda perhatikan waktu membuat daftar musuh atau daftar bonus.

Posisi awal
Posisi awal untuk musuh atau bonus diisi dengan nilai di luar koordinat layar. Titik koordinat kiri bawah layar monitor adalah(-800,-600) dan titik kanan atas adalah(800,600).


Titik Tengah
Ukuran kotak pembatas yang dipakai untuk deteksi tabrakan pada musuh atau bonus adalah 150X50 satuan. Titik tengah dipakai sebagai titik acuan untuk menentukan posisi awal dari musuh atau bonus agar berada di luar layar.


Hadap Kiri atau Kanan
Jika Anda membuat musuh atau bonus menghadap ke kanan maka nilainya harus diisi dengan 1(satu), jika menghadap ke kiri diisi dengan 2(dua).


Waktu Aktif
Waktu bagi musuh atau bonus untuk tampil di layar.

Pergerakan
Rekan-rekan dapat memberikan gerakan kepada musuh atau bonus seperti yang ogut terangkan sebelumnya. Setiap gerakan terdiri dari satu karakter dan tiga digit angka, contoh “B999”, “I010”, “H010”. Maksimal gerakan yang bisa di tampung oleh satu musuh atau bonus sebanyak 25 gerakan.

Spasi
Karena yang dipakai untuk menyimpan daftar adalah file teks maka masalah spasi harus diperhatikan. Setelah  record terakhir dimasukkan buanglah semua spasi setelah karakter terakhir agar pada saat proses loading progam tidak mengalami kegagalan(error).

Ascending
Urutan record-record pada file teks harus didasarkan pada waktu aktif secara ascending.
Sebagai contoh untuk pembuatan musuh atau bonus coba perhatikan isi dari tabel berikut ini.


Perhatikan posisi awal, letak titik koordinat posisi ini selalu berada di luar layar monitor agar pesawat tidak muncul secara tiba-tiba di layar monitor. Record-record pada tabel di atas diurutkan secara ascending berdasarkan waktu aktif.

#include"My7OpenGL.h"
#include"GEEmas7.h"

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

/////////////////////////////
//Fungsi utama
/////////////////////////////
int WINAPI WinMain(HINSTANCE HInstanceP,
HINSTANCE HPrevinstanceP,
LPSTR LpcmdLineP, int NShowcmdP)
{
GameOpenGL.SetHInstance(HInstanceP);
if (!GameOpenGL.CreateOpenGLWindow(MainHWND))
return 0;

if (!GameObject.geInisialisasi(MainHWND))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameOpenGL.DisplayLoading();
GameObject.gePlayRandomSoundBG();

/////////////////////////////
//Load musuh
/////////////////////////////
if (!GameObject.geLoadEnemyList("Enemy/Enemy.txt"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

/////////////////////////////
//Load bonus
/////////////////////////////
if (!GameObject.geLoadBonusList("Bonus/Bonus.txt"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

/////////////////////////////
//Posisi screen ditampilkan
/////////////////////////////
GameObject.geDisplayPosisiScreen();
GameObject.geSetGameLoop();

while (GameOpenGL.OpenGLMainLoop)
    {
GameOpenGL.MessageHandle();

/////////////////////////////
//Render objek game,
//di bawah ini
/////////////////////////////

GameObject.geDisplayBG();

/////////////////////////////
//Musuh dan bonus
/////////////////////////////
GameObject.geDisplayEnemy();

GameObject.geDisplayJackFighter();

/////////////////////////////
GameOpenGL.OpenGLSwapBuffer();
GameOpenGL.BreakProgram();

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Program di atas adalah program yang memakai musuh dan bonus yang berasal dari dua buah file teks. Kedua file teks harus Anda load dahulu sebelum memasuki tahap pengulangan while. Jika program di atas dijalankan maka Anda akan menemukan musuh dan bonus dengan variasi gerakan yang lain dari program sebelumnya. Jumlah musuh atau bonus yang dapat sekaligus tampil di layar monitor sebanyak 25 buah, angka ini sebaiknya tidak Anda ubah, sebab jika terlalu besar maka layar monitor akan terlalu sesak.

Modifikasi Karakteristik Musuh dan Bonus
Ada enam karakteristik yang bisa Anda ubah sesuai dengan kebutuhan, power untuk musuh dan bonus, daya penghancur jika musuh atau bonus ditabrak oleh Jack Fighter, kekuatan peluru musuh dan peluru Jack Fighter jika menabrak objek lain.

Semua nilai karakteristik di atas bisa rekan-rekan ubah pada file GEEmas7.h.

...
...
...
//////POWER and DESTRUCT
#define POWERJF 5000
#define POWERENEMY 700
#define DESTRUCTENEMY 700
#define POWERBIGBOSS 10000
#define POWERBONUS 500
#define DESTRUCTBONUS 500

#define DESTRUCTPELURUJF 100
#define DESTRUCTPELURUENEMY 100
...
...
...

Batas Deteksi Tabrakan
Sama dengan tokoh Jack Fighter ogut juga menyiapkan fungsi yang bisa dipakai untuk menampilkan garis-garis batas deteksi tabrakan yang berada di sekeliling  musuh atau bonus.

#include"My7OpenGL.h"
#include"GEEmas7.h"

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

/////////////////////////////
//Fungsi utama
/////////////////////////////
int WINAPI WinMain(HINSTANCE HInstanceP,
HINSTANCE HPrevinstanceP,
LPSTR LpcmdLineP, int NShowcmdP)
{
GameOpenGL.SetHInstance(HInstanceP);
if (!GameOpenGL.CreateOpenGLWindow(MainHWND))
return 0;

if (!GameObject.geInisialisasi(MainHWND))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameOpenGL.DisplayLoading();

/////////////////////////////
//Batas deteksi tabrakan
//Jack, musuh dan bonus
//diaktifkan
/////////////////////////////
GameObject.geDisplayPolygonJackFighter(); 
GameObject.geDisplayPolygonEnemy();
GameObject.geDisplayPolygonBonus(); 

GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

while (GameOpenGL.OpenGLMainLoop)
    {
GameOpenGL.MessageHandle();

/////////////////////////////
//Render objek game,
//di bawah ini
/////////////////////////////

GameObject.geDisplayBG();

/////////////////////////////
//Musuh dan bonus
/////////////////////////////
GameObject.geDisplayEnemy();

GameObject.geDisplayJackFighter();


/////////////////////////////
GameOpenGL.OpenGLSwapBuffer();
GameOpenGL.BreakProgram();

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Bila program di atas dijalankan maka akan tampak garis-garis merah yang merupakan garis untuk proses deteksi tabrakan seperti gambar di bawah.


Waduh panjang ya artikel ini, tapi artikel yang panjang ini kode pogramnya sangat singkat dan mudah sekali untuk dipelajari, jadi silahkan rekan-rekan berkresi sendiri untuk membuat musuh dan bonus. Tekstur bisa Anda ganti dengan karakter pesawat ciptaan Anda sendiri demikian juga dengan bonus. Power dan daya penghancur musuh bisa Anda tentukan sendiri, manufer-manufer cantik musuh bisa Anda buat sesuka Anda, akhir kata ogut ucapkan selamat berkreasi.

Salam Game Engine


Heriady
heriady.yoh@gmail.com



Artikel terkait

Panduan Lengkap Membuat Game Perang Shoot Them Up

Panduan Lengkap Membuat Game Perang Dengan Game Engine