Setelah kita dapat menjalankan kerangka dasar dari sebuah game (game kosong) pada bab sebelumnya, saatnya untuk mengutilisasi class dari Brantem untuk membuat game yang sebenarnya!.
Brantem memiliki beberapa class yang berhubungan langsung dengan programer, dalam pembuatan game duel, antara lain :
- Abstract Class Battle
Programer harus menurunkan class Battle dan mengimplementasikan semua fungsionalitas yang ada untuk memulai pembuatan game duel. - Class ScoreBean
Class ini berfungsi sebagai class penampung atribut papan nilai, mulai dari tampilan papan nilai, sampai counter waktu yang dibutuhkan dalam setiap pertarungan. - Abstract Class Arena
Programer harus menurunkan class Arena dan mengimplementasikan semua fungsionalitas yang ada. Yang antara lain berupa inisialisasi konfigurasi pertarungan, inisialisasi latar belakang serta musik pengantar. - Class ConfigBean
Class ini berfungsi sebagai class penampung konfigurasi pertarungan, seperti jumlah ronde pertarungan, tombol pause dan teks pesan yang muncul di layar. - Class MessageBean
Menampung teks pesan yang tampil dalam game pertarungan serta suara yang menyertai pemunculan teks pesan. - Class SpriteBean
Sama halnya dengan ScoreBean, SpriteBean juga berfungsi untuk menampung informasi mengenai animasi pemain, gambar latar belakang - Class SoundBean
Menyimpan seluruh informasi mengenai suara yang di gunakan dalam game. - Abstract Class Duel
Programer harus menurunkan class Duel dan mengimplementasikan semua fungsionalitas yang ada. Yang antar lain berupa inisialisasi pemain, tombol navigasi serta teks pesan. - Abstract Class Fighter
Programer harus menurunkan class Fighter dan mengimplementasikan semua fungsionalitas yang ada. Class Fighter berisi seluruh fungsionalitas animasi dari suatu karakter. - Class KeyBean
Class ini menampung informasi tombol navigasi pemain yang bisa di bagi menjadi 3 kelompok besar, arah, pukulan dan tendangan. - Kumpulan Class Animasi
Class ini berisi atribut animasi gerakan karakter. Atribut animasi karakter berbeda-beda, tergantung jenis animasi itu sendiri. Contoh animasi loncat memiliki attribute koordinat vertikal untuk menentukan lokasi penggambaran karakter, sedangakan animasi berdiri tidak membutuhkan attribute koordinat vertikal
Catatan : Program di bawah ini merupakan potongan-potongan program dari demo Brantem, untuk lengkapnya anda bisa mendownload. Dan potongan-potongan program ini menekankan pada pemakaian framework Brantem.
DemoGame.java
Karena BattleEngine, yang kita gunakan dalam framework barantem, merupakan turunan dari GameObject maka di perlukan GameEngine sebagai fondasi awal menjalankan game. Programer harus mengetahui konsep dan cara kerja GameEngine terlebih dahulu, panduan mengenai GameEngine dapat di peroleh di http://goldenstudios.or.id/index.phppublic class DemoGame extends GameEngine{ // deklarasi variable public static final String FILE_LOGO = "com/sf/resource/sprite/logo.jpg"; public static final String FILE_SMALL_FONT = "com/sf/resource/sprite/smallFont.png"; public static final ........ .... // bagian dari game DemoGame public GameObject getGame(int id) { switch (id) { case : ..... case PLAY_KEN : { ...... return new BattleEngine(this, new StreetFighter(this)); } ........ } } // jalankan program DemoGame public static void main(String[] args) { GameLoader loader = new GameLoader(); loader.setup(new DemoGame(), new Dimension(350, 190), false); loader.start(); } }Keterangan : GameEngine di gunakan untuk memecah bagian berdasarkan fungsinya, dari program di atas kita bisa lihat apabila variable id di method getGame, memiliki nilai yang sama dengan PLAY_KEN maka class BattleEngine akan di bentuk dengan parameter class StreetFighter dan class DemoGame. Dan agar program kita bisa berjalan jangan lupa untuk menambahkan public static void main
StreetFighter.java
Class StreetFighter harus merupakan turunan dari Class Battle, dan harus mengimplementasikan 1 constructor dan 3 methodpublic class StreetFighter extends Battle{ // deklarasi variable private GameEngine gameEngine; // bagian dari game DemoGame public StreetFighter(GameEngine gameEngine) { this.gameEngine = gameEngine; } // inisialisasi papan nilai public ScoreBean initScoreBoard() { return new ScoreBean(130, 99, 5, Color.GRAY, Color.YELLOW, Color.GRAY, 0, 0); } // inisialisasi pertarungan public Arena initArena() { return new SFBattleAreana(); } // dipanggil apabila pertarungan telah selesai public void finish() { gameEngine.nextGameID = DemoGame.TITLE; } }Keterangan : Pertama-tama kita harus membuat konstruktor dengan parameter gameEngine, gameEngine ini akan di pakai di method finish(), yaitu menentukan langkah selanjutnya yang akan di ambil, apabila pertarungan telah selesai. Method initScoreBoard() bertujuan untuk pembuatan papan nilai pertarungan, untuk ke dua pemain, untuk keterangan masing2 parameter dapat di lihat di dokumentasi Brantem. Method initArena() bertujuan untuk inisialisasi konfigurasi permainan
SFBattleAreana.java
Class SFBattleAreana merupakan turunan dari Class Arena dan harus mengimpementasikan 4 method antara lain : initBackground(), initMusic(), initDuel() dan initConfig()public class SFBattleAreana extends Arena{ // inisialisai latar belakang public SpriteBean initBackground() { return new SpriteBean("com/sf/resource/sprite/bg.png", 1, 4); } // inisialisai musik pengantar public SpriteBean initMusic() { return new SoundBean("com/sf/resource/sound/Music1.mid"); } // inisialisasi petarung, tombol dan teks pesan public Duel initDuel() { return new SFDuel(); } // konfigurasi teks pesan dan permainan seperti jumlah ronde public ConfigBean initConfig() { MessageBean messageBean = new MessageBean(); messageBean.setDrawMsg("Draw", "com/sf/resource/sound/Fire.wav"); ......... return new ConfigBean(3, 2, KeyEvent.VK_PAUSE, messageBean); } }Keterangan : Class ini merupakan class konfigurasi. Method initBackground() berfungsi untuk inisialisasi latar belakang permainan, sama halnya dengan initMusic() yang merupakan inisialisasi musik pengantar. Method initDuel() merupakan class konfigurasi pula yang akan kita bahas setelah ini. Method initConfig() merupakan konfigurasi pemainan
SFDuel.java
Class SFDuel merupakan turunan dari Class Duel dan harus mengimpementasikan 6 method antara lain : initFighter1(), initFighter2(), initBigFont(), initSmallFont(), initKeyPlayer1() dan initKeyPlayer2()public class SFDuel extends Duel{ // inisialisai animasi pemain 1 public Fighter initFighter1() { return new Ken(); } // inisialisai animasi pemain 2 public Fighter initFighter2() { .... } // inisialisasi teks pesan ukuran besar public SpriteBean initBigFont() { return new SpriteBean("com/sf/resource/sprite/bigFont.png", 8, 12); } // inisialisasi teks pesan ukuran kecil public SpriteBean initSmallFont() { ....... } // inisialisasi tombol pemain 1 public KeyBean initKeyPlayer1() { KeyBean bean = new KeyBean(); bean.setDirection(KeyEvent.VK_W, KeyEvent.VK_S, KeyEvent.VK_A, KeyEvent.VK_D); bean.setActionPunch(KeyEvent.VK_R, KeyEvent.VK_T, KeyEvent.VK_Y); bean.setActionKick(KeyEvent.VK_F, KeyEvent.VK_G, KeyEvent.VK_H); return bean; } // inisialisasi tombol pemain 2 public KeyBean initKeyPlayer2() { ....... } // bila pemain 2 bukan komputer ini harus return null public FighterAI initPlayerAI() { return new SFAI(); } }Keterangan : Class ini merupakan class konfigurasi. Animasi pemain 1 dan pemain 2 yang di inisialisasikan melalui method initFighter1() dan initFighter2(). Inisialisasi teks pesan di bagi menurut ukuran dari font yaitu teks pesan besar dan teks pesan kecil melalui method iniBigFont() dan initSmallFont(). Dan juga konfigurasi tombol pemain 1 dan 2 melalui method initKeyPlayer1() dan initKeyPlayer2()
Ken.java
Class Ken merupakan turunan dari Class Fighter yang mengimplementasikan seluruh kemungkinan animasi karakter. Di class ini lah segala sesuatu mengenai karakter di definisikanpublic class Ken extends Fighter{ // posisi letak koordinat Y pemain public int getYCoordinate() { return 75; } // nama karakter pemain public String getName() { return "KEN"; } // inisialisasi animasi pemain public SpriteBean[] initResource() { SpriteBean[] resource = new SpriteBean[3]; resource[0] = new SpriteBean("com/sf/resource/sprite/character/kenSB.png", 1, 1); resource[0] = ....... return resource; } // inisialisasi kombinasi tombol, umumnya untuk mengeluarkan ilmu public AdvanceKeyCapture[] initCaptureKeys(BaseInput baseInput, KeyBean keyBean) { AdvanceKeyCapture[] arrayKey = new AdvanceKeyCapture[9]; int[] punchMagic = new int[]{keyBean.getLeft(), keyBean.getDown(), keyBean.getLeft()}; int[] punchMagic = .... ................ arrayKey[0] = new AdvanceKeyCapture(baseInput, punchMagic, 1000, keyBean.getWeakPunch(), Controls.DIRECTION_UP, Controls.STATUS_SPECIAL1); arrayKey[1] = ....... ................ return arrayKey; } // salah satu contoh animasi sprite public IntroSprite doIntro(BufferedImage[] bufferedImages) { int[] frames = new int[] {1}; double[] horizontal = new double[] {0}; return new IntroSprite(bufferedImages, medium, frames, horizontal, "com/sf/resource/sound/Action.wav"); } public StandSprite doStand(BufferedImage[] bufferedImages) { .................. } .................... }Keterangan : Class ini merupakan representasi dari karakter pemain, yang terdiri koordinat Y pemain, nama karakter pemain, resource animasi pemain, kombinasi tombol pemain serta animasi pemain.
Sampai sini, anda sebagai programer sudah bisa membuat game duel, bagaimana cukup simple dan cepet bukan ?
Selanjutnya kita akan membahas masing-masing parameter yang ada di masing-masing class yang berhubungan dengan programer,
atau bisa juga lihat dokumentasi framework Brantem.
class :: ScoreBean Constructor: public ScoreBean(int barLength, int counter, int scoreHight, Color borderColor, Color barColor, Color barBgColor, int P1PictureIndex, int p2PictureIndex) {} dimana : barLength = Panjang papan nilai counter = Waktu yang di sediakan per ronde scoreHight = Tinggi papan nilai borderColor = Warna pinggir papan nilai barColor = Warna papan nilai barBgColor = Warna belakang papan nilai P1PictureIndex = Index gambar pemain 1 P2PictureIndex = Index gambar pemain 2
class :: SpriteBean Constructor: public SpriteBean(String file, int colums, int rows) {} dimana : file = Lokasi file colums = Jumlah kolom rows = Jumlah baris
class :: SoundBean Constructor: public SoundBean(String file) {} dimana : file = Lokasi file
class :: MessageBean Method: public void setXXXMsg(String message, String sound) {} dimana : message = Teks pesan sound = Lokasi file suara
class :: ConfigBean Constructor: public void ConfigBean(int rounds, int bgSpeed, int pause, MessageBean messageBean) {} dimana : rounds = Jumlah ronde dalam pertarungan bgSpeed = Kecepatan horisontal gerak latar belakang pause = Tombol untuk fungsi pause messageBean = Teks pesan dan suara yang tampil dan terdengar dalam pertarungan
class :: KeyBean Method: public void setDirection(int up, int down, int left, int right) {} dimana : up = tombol atas atau lompat down = tombol bawah atau jongkok left = tombol kiri atau jalan mundur right = tombol kiri atau jalan maju public void setActionPunch(int weakPunch, int mediumPunch, int strongPunch) {} dimana : weakPunch = tombol pukulan lemah mediumPunch = tombol pukulan menengah strongPunch = tombol pukulan kuat public void setActionKick(int weakKick, int mediumKick, int strongKick) {} dimana : weakKick = tombol tendangan lemah mediumKick = tombol tendangan menengah strongKick = tombol tendangan kuat
class :: AdvanceKeyCapture Constructor: public AdvanceKeyCapture(BaseInput baseInput, int[] keys, int time, int key, int dir, int stat) {} dimana : baseInput = Tombol Listener dari class GTGE keys = Tombol kombinasi arah time = Batas waktu untuk melakukan kombinasi arah key = Tombol status dir = Arah stat = StatusKarena jumlah animasi sprite terlalu banyak, maka di ambil salah satu contoh saja, namun representasi parameter sama dengan class animasi lainnya
class :: SpecialAttackSprite Constructor: public SpecialAttackSprite(BufferedImage[] bufferedImages, Timer timer, int[] frames, int hitPoint, int[] attack, double[] horizontal, double[] vertical, boolean isAttackSprite, MagicSprite magicSprite, String soundPath) {} dimana : bufferedImages = Kumpulan gambar karakter timer = Waktu animasi karakter frames = Nomor array yang di pilih hitPoint = Nilai serangan attack = Nomor array serangan horizontal = Kecepatan horisontal vertical = Koordinat vertikal, notes : ini bukan kecepetan vertikal isAttackSprite = Apakah animasi ini animasi serangan magicSprite = Animasi ilmu soundPath = Lokasi file suara