Tampilkan postingan dengan label Shoot Them Up. Tampilkan semua postingan
Tampilkan postingan dengan label Shoot Them Up. Tampilkan semua postingan

Minggu, 23 Agustus 2015

Membuat Babak atau Level Game Engine

Membuat beberapa babak atau biasa disebut level di game engine


Selamat pagi semuanya, salam sukses dan salam sejahterah selalu...ini adalah artikel terakhir yang membahas tentang game engine yang ogut buat sendiri. Beberapa artikel sebelumnya ogut mengulas tuntas game engine GEEmas7, untuk melihat daftar artikel lengkap tentang game engine ini harap klik disini. Di dalam daftar tersebut rekan-rekan bisa membaca setiap artikel yang ogut tulis tentang game engine ini secara lengkap dan berurutan.


Artikel kali ini akan membahas cara untuk membuat babak atau level di game engine ini. Masih sama dengan cara sebelumnya rekan-rekan hanya butuh meng-edit MainProgram.cpp untuk menambahkan level di game bertipe shoot them up ini.

Pada game engine ini level bisa Anda buat dengan memakai trik sederhana.

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

HWND MainHWND = NULL;

My7OpenGL GameOpenGL;
GEEmas7 GameObject;

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();

//////////////////////////
//Loading data level-1
//////////////////////////
if (!GameObject.geLoadBGTexture
("BmpData/BG1.bmp"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

if (!GameObject.geLoadJFTexture(
"JF/kiri.bmp",
"JF/kanan.bmp",
"JF/gkiri.bmp",
"JF/tengah.bmp",
"JF/gkanan.bmp"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

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

if (!GameObject.geLoadEnemyList
("Level_1/enemy_LV1.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

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

if (!GameObject.geLoadBonusList
("Level_1/Bonus_LV1.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }


if (!GameObject.geLoadBigBossTexture(
"BigBoss1/gkiri.bmp",
"BigBoss1/tengah.bmp",
"BigBoss1/gkanan.bmp"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

if (!GameObject.geLoadBigBoss
("Level_1/BigBoss_LV1.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }


GameObject.gePlayRandomSoundBG();
GameObject.geSetGameLoop();

//////////////////////////
//while untuk level-1
//////////////////////////
while (GameOpenGL.OpenGLMainLoop && 
GameObject.geGameLoop)
    {
GameOpenGL.MessageHandle();

//////////////////////////
//render
//////////////////////////
GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();

GameObject.geDisplayEffect();

//////////////////////////

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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

//////////////////////////
//untuk mendeteksi
//game terus berlanjut
//ke level berikutnya
//atau tidak
//////////////////////////
if (GameObject.geContinue)
{ //////////////////////////
//Loading data level-2
//////////////////////////

GameOpenGL.DisplayLoading();

if (!GameObject.geLoadBGTexture
("BmpData/BG2.bmp"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

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

if (!GameObject.geLoadEnemyList
("Level_2/enemy_LV2.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

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

if (!GameObject.geLoadBonusList
("Level_2/Bonus_LV2.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

if (!GameObject.geLoadBigBossTexture(
"BigBoss2/gkiri.bmp",
"BigBoss2/tengah.bmp",
"BigBoss2/gkanan.bmp"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

if (!GameObject.geLoadBigBoss
("Level_2/BigBoss_LV2.txt"))
{ GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0; }

}
else
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameObject.geSetGameLoop();

//////////////////////////
//while untuk level-2
//////////////////////////
while (GameOpenGL.OpenGLMainLoop && 
GameObject.geGameLoop)
    {
GameOpenGL.MessageHandle();

//////////////////////////
//render
//////////////////////////
GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();

GameObject.geDisplayEffect();

GameObject.gePlayRandomSoundBG();
//////////////////////////

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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Pada listing program di atas terdapat dua buah pengulangan while, yang pertama digunakan untuk level pertama, dan yang kedua dipakai untuk level berikutnya.

Listing program di atas tidak berbeda jauh dengan program-program yang telah ogut terangkan sebelumnya, hanya pada saat setelah pengulangan while pertama terdapat kondisi if untuk mendeteksi apakah game masih bisa berlanjut ke level berikutnya atau game sudah selesai karena Jack Fighter telah dikalahkan musuh.

Dengan menggunakan kondisi if seperti di atas maka game bisa dibuat menjadi beberapa level. Musuh, bonus dan Big Boss di load untuk setiap level-nya sehingga masing-masing level mempunyai musuh, bonus dan Bis Boss dengan karakter yang berbeda-beda. Untuk lebih jelas tentang proses load ini harap klik link musuh dan bonus serta link Big Boss.

Tampilan level pertama


tampilan level berikutnya.


Demikian rekan-rekan artikel tentang game engine ini, proses pembuatan game shoot them up dengan game engine ini sudah ogut bahas semua, sampai jumpa di artikel yang lain.

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

Sabtu, 22 Agustus 2015

Membuat Efek Tambahan dengan Game Engine

Membuat efek kilatan cahaya secara acak dengan game engine


Selamat pagi semuanya, salam sukses selalu...ini adalah artikel terakhir sebelum libur weekend dan pada kesempatan kali ini ogut akan membahas tentang efek tambahan yang dapat ditambahkan ke dalam game yang kita buat dengan menggunakan game engine.

Efek berupa kilatan cahaya yang akan menambah nilai visualisasi game dapat dibuat dengan menambahkan satu baris kode program pada MainProgram.cpp.



Untuk membuat efek seperti gambar di atas tambahkan fungsi geDisplayEffect()  ke dalam MainProgram.cpp.

#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 && GameObject.geGameLoop)
{
GameOpenGL.MessageHandle();

GameObject.geDisplayBG();
GameObject.geDisplayEnemy();
GameObject.geDisplayBigBoss();
GameObject.geDisplayJackFighter();

/////////////////////////////
//Efek kilatan cahaya
/////////////////////////////
GameObject.geDisplayEffect();

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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Jika program di atas dijalankan maka akan tampak kilatan cahaya secara acak.

Bentuk kilatan cahaya

dan bentuk lainnya.

Demikian rekan-rekan artikel kali ini, sangat mudah bukan, hanya menambahkan satu baris program saja maka efek kilatan cahaya akan tampil.

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

Jumat, 21 Agustus 2015

Membuat Musuh Terakhir atau Big Boss Game Engine

Membuat musuh terakhir dengan game engine


Selamat pagi rekan-rekan, teman-teman, adik-adik, agan dan aganwati, tak terasa ya pembahasan tentang game engine yang ogut buat telah berjalan sedemikian jauh. Dan kali ini ogut akan membahas tentang musuh terakhir yang akan ditampilkan di game engine.

Musuh terakhir atau biasa disebut dengan raja atau dewa oleh para pemain game, tetapi ogut lebih senang menyebutnya dengan istiah Big Boss. Big Boss disertakan sebagai musuh terakhir yang harus dikalahkan oleh Jack Fighter untuk memenangkan peperangan. Dengan game engine kode program yang harus di tambahkan sangat singkat dan sederhana Anda hanya cukup meng-edit file MainProgram.cpp dan dalam sekejab mata Big Boss akan muncul.


geDisplayBigBoss
Untuk menampilkan raja atau Big Boss di layar monitor caranya dengan menggunakan fungsi geDisplayBigBoss yang ditempatkan dalam pengulangan 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();

GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

/////////////////////////////////////////////////
//kondisi while ditambahkan GameObject.geGameLoop
//jika Big Boss ditampilkan
/////////////////////////////////////////////////
while (GameOpenGL.OpenGLMainLoop && GameObject.geGameLoop)
{
GameOpenGL.MessageHandle();

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

GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

/////////////////////////////
//Big Boss
/////////////////////////////
GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();


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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Program di atas bila dijalankan akan menampilkan Big Boss pada saat hitungan waktu berada di angka 170.


geGameLoop
Perhatikan kode program di atas, kodisi while berbeda dengan kodisi while di program-program terdahulu.

...
...
...
while (GameOpenGL.OpenGLMainLoop && GameObject.geGameLoop)
{
...
...
...
}
...
...
...

Penambahan kondisi while dengan geGameLoop wajib Anda lakukan jika Big Boss ingin Anda tampilkan.

Mengganti Tekstur Big Boss
Ogut juga membuat fungsi yang bisa dipakai untuk mengganti tekstur Big Boss.

#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 Big Boss tekstur
/////////////////////////////
if (!GameObject.geLoadBigBossTexture(
"BigBoss1/gkiri.bmp",
"BigBoss1/tengah.bmp", 
"BigBoss1/gkanan.bmp"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

/////////////////////////////////////////////////
//kondisi while ditambahkan GameObject.geGameLoop
//jika Big Boss ditampilkan
/////////////////////////////////////////////////
while (GameOpenGL.OpenGLMainLoop && GameObject.geGameLoop)
{
GameOpenGL.MessageHandle();

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

GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

/////////////////////////////
//Big Boss
/////////////////////////////
GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();


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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Cara membuat tekstur Big Boss tidak berbeda dengan membuat tekstur musuh atau bonus, yang perlu diperhatikan ukuran tinggi dan lebar file bitmap yang digunakan, karena ukuran fisik Big Boss lebih besar dari ukuran musuh atau bonus.


Membuat Big Boss
Sama seperti musuh atau bonus Anda bisa membuat Big Boss sendiri sesuai dengan keinginan rekan-rekan.

Big Boss hanya bisa dibuat sebanyak satu saja oleh sebab itu perhatikan record yang Anda simpan pada file teks, dan ukuran raja lebih besar dari musuh yaitu 450X150 satuan.

Untuk posisi menghadap kiri atau kanan, ogut menetapkan Big Boss tidak bisa menghadap ke kiri, sehingga nilai variabel ini selalu 1(satu).

Ketiga hal di atas harus Anda perhatikan pada saat hendak membuat Big Boss, sedangkan aturan lain seperti posisi awal, waktu aktif dan pergerakan Big Boss sama dengan aturan yang dipakai untuk 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();

/////////////////////////////
//Load objek Big Boss
/////////////////////////////
if (!GameObject.geLoadBigBoss("BigBoss/BigBoss.txt"))
{
GameOpenGL.CloseOpenGLWindow(MainHWND);
return 0;
}

GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

/////////////////////////////////////////////////
//kondisi while ditambahkan GameObject.geGameLoop
//jika Big Boss ditampilkan
/////////////////////////////////////////////////
while (GameOpenGL.OpenGLMainLoop && GameObject.geGameLoop)
{
GameOpenGL.MessageHandle();

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

GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

/////////////////////////////
//Big Boss
/////////////////////////////
GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();


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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

Untuk bisa menampilkan Big Boss yang Anda buat, sebelum pengulangan while Anda harus memanggil proses loading terhadap file teks yang digunakan untuk menyimpan record Big Boss.

Modifikasi Power Big Boss
Jika Anda ingin mengubah nilai power untuk Big Boss dan nilai kekuatan peluru Big Boss, maka maka dapat melakukannya di file header 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
#define DESTRUCTPELURUBIGBOSS 200
...
...
...

Perubahan kedua nilai di atas jangan terlalu besar, sebab akan mengakibatkan tidak seimbangnya antara kekuatan Jack Fighter dengan kekuatan musuh.

Batas Deteksi Tabrakan
Untuk memudahkan Anda dalam proses pembuatan Big Boss, ogut juga menyediakan fungsi yang bisa Anda pakai untuk menampilkan garis-garis merah yang mengelilingi Big Boss.

#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();

/////////////////////////////
//tampilkan garis merah
//Big Boss
/////////////////////////////
GameObject.geDisplayPolygonBigBoss();


GameObject.gePlayRandomSoundBG();

GameObject.geSetGameLoop();

/////////////////////////////////////////////////
//kondisi while ditambahkan GameObject.geGameLoop
//jika Big Boss ditampilkan
/////////////////////////////////////////////////
while (GameOpenGL.OpenGLMainLoop && GameObject.geGameLoop)
{
GameOpenGL.MessageHandle();

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

GameObject.geDisplayBG();

GameObject.geDisplayEnemy();

/////////////////////////////
//Big Boss
/////////////////////////////
GameObject.geDisplayBigBoss();

GameObject.geDisplayJackFighter();


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

GameObject.geTimerGEEmas7(GAME_DELAY);
}

GameOpenGL.CloseOpenGLWindow(MainHWND);

return 0;
}

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


Tombol Escape
Pada program-program sebelumnya semua program yang dibuat bisa dihentikan dengan tombol Esc.

Jika Anda memasukkan komponen Big Boss ke dalam game ini maka tombol Esc yang dipakai untuk menghentikan program, bisa dihilangkan, sehingga game hanya bisa berhenti jika tokoh Jack Fighter kalah atau menang dalam peperangan.

Untuk menghilangkan fungsi tombol Esc remark kode program GameOpenGL.BreakProgram();
...
...
...
//GameOpenGL.BreakProgram();
...
...
...

Berikut tampilan yang akan muncul jika Jack Fighter kalah berperang


dan jika menang


Demikian rekan-rekan, selesai sudah pembahasan tentang Big Boss, sampai jumpa di artikel berikutnya.

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

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