You are on page 1of 26

TUTORIAL ENGINE GAME FOR EDUCATION (EGFE)

Conducted by : TEAM JARC

VERSION 1.0

SOUTHEAST ASIAN MINISTERS OF EDUCATION ORGANIZATION SEAMEO REGIONAL OPEN LEARNING CENTER SEAMEO-SEAMOLEC 2009

Pengantar Perkembangan game khususnya di indonesia saat ini sudah semakin pesat dimana beberapa instansi pemerintahan, SMU/SMK, sudah membuat content game edukasi, bahkan beberapa peguruan tinggi sudah mulai membuka jurusan Game Tech. perusahaan perusahaan IT di Indonesia-pun banyak yang mulai mengarah pada produksi pembuatan game. Dengan semakin bertambahnya minat masyarakat terhadap aplikasi game khususnya game mobile, mendorong kami untuk menyediakan sebuah engine yang dapat dipelajari dan digunakan untuk keperluan pembuatan game sehingga lahirlah ide untuk menciptakan engine EGFE. EGFE atau Engine Game For Education adalah salah suatu engine yang dibuat untuk membantu para developer/programmer khususnya programmer newbie dalam proses pembuatan aplikasi game mobile. Dengan adanya engine ini diharapkan para developer game mobile dapat mempersingkat waktu dalam pembuatan interface awal seperti pembuatan

SplashScreen, Main Menu, HighScore, Help, About dan beberapa tambahan utility, sehingga developer lebih terfokus pada scenario dan game play.
Architecture Engine Game For Education Game Aplication Engine GFE GFEInfo HighScore Main Menu Splash Screen Resource J2ME Utils Interface Game Play

I/O Device

Page 1 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Struktur Engine GFE Seperti yang kita ketahui bersama bahwa ketika membuat class turunan dari MIDLet maka yang harus dilakukan adalah mengimport paket

javax.microedition.midlet.* begitu juga caranya apabila seorang developer ingin mengimplementasikan EGFE pada game yang akan di buat. EGFE di simpan dalam package egfe sehingga untuk dapat mengakses fungsi-fungsi dari engine ini para pengembang harus mengimport paket egfe.* Berikut ini adalah struktur engine yang di bangun untuk mobile game.
Struktur Engine For Game Education(EGFE)

Package egfe
Action SplashScreen MainMenu HighScore GFEInfo Keterangan: Package Interface Class Implement MainMenuAction utils GFERand SoundManager env Images

Seperti yang terlihat pada gambar struktur EGFE di atas bahwa sudah tersedia beberapa class yang digunakan untuk mempermudah dalam pembuatan game seperti splash screen, main menu, penyimpanan high score, penyediaan informasi seperti info pembuat game dan petunjuk penggunaan, fungsi pembangkitan bilangan acak dan managemen suara. Terdapat dua buah package yaitu egfe.env untuk penyimpanan gambar internal(khusus gambar yang digunakan dalam engine) dan egfe.utils untuk class yang menyediakan fungsi-fungsi tambahan. Page 2 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Action Interface Action merupakan penghubung antara beberapa class agar dapat dijalankan dalam sebuah class lain sehingga aplikasi game dapat berjalan dengan lancar tanpa menentukan protocol yang lebih spesifik lagi. Interface ini harus di implementasi pada class yang membutuhkan method action untuk menjalankan suatu event dan hanya menyediakan sebuah method yaitu action dengan sebuah parameter bertipe integer yang digunakan sebagai rule apabila diperlukan pada saat menjalankan method tersebut.

Task A No Rules Task B Task C Task to-N

action(int)
Rules (if)

Interface Action di implementasi oleh class SplashScreen, MainMenu dan GFEInfo, adapun task yang akan dijalankan di tulis di dalam method action yang telah di override, sedangkan rule dapat ditentukan sesuai dengan kebutuhan pada saat pemanggilan method action. Tidak menutup kemungkinan interface Action ini di implementasi oleh class-class yang di bangun pada saat pembuatan aplikasi game mobile untuk menjalankan task berdasarkan rule yang ditentukan sesuai dengan kebutuhan.

Page 3 Tutorial EGFE JARC SEAMEO-SEAMOLEC

SplashScreen Dalam sebuah permainan sering muncul istilah splash screen yang merupakan tampilan awal dari sebuah aplikasi game, ketika program melakukan proses yang membutuhkan waktu yang relatif lama user/player akan merasa bosan menunggu proses dengan tampilan berupa layar kosong, untuk itu diperlukan sebuah tampilan berupa gambar yang dapat berisi informasi perusahaan pembuat, nama pembuat, logo permainan, sehingga akan lebih menarik perhatian dari user ataupun player. Permasalahan di atas dapat diatasi oleh class SplashScreen yang berada di dalam package egfe.SplashScreen dengan menggunakan beberapa fungsi yang ada di dalamnya. Berikut ini keterangan constructor dan fungsi-fungsi yang ada di dalam class SplashScreen: Method Constructor Keterangan

Constructor SplashScreen melewatkan sebuah parameter bertipe integer - delayTime setting selang waktu tampilan slash screen dalam satuan detik(s) boolean Menentukan image yang akan ditampilkan pada screen setImage(String location) - location menentukan lokasi penyimpanan image @ return true jika gambar ditemukan dan selain itu bernilai false void Menentukan Tampilan selanjutnya setelah splash screen setNext(Display display, mencapai waktu yang ditentukan Action next) - display untuk menampilkan next display - next action yang akan dijalankan setelah splash screen mencapai waktu yang ditentukan void start() Menjalankan splash screen dan akan berhenti secara otomatis apabila mencapai waktu yang ditentukan. void stop() Menghentikan proses splash screen void action(int action) Menjalankan aksi pada object SplashScreen - action digunakan sebagai rule Penggunaan splash screen pada game mobile biasanya pada saat aplikasi di jalankan dan ketika keluar dari aplikasi game dengan jedah waktu yang tidak terlalu lama (sekitar 1 s/d 5detik) pada saat keluar dari aplikasi, sedangkan pada saat aplikasi pertama di jalankan disesuaikan dengan proses yang dijalankan dan biasanya membutuhkan waktu relatif lama (setikar 5 s/d 15detik). Berikut ini adalah gambaran umum penggunaan method yang berada di dalam class SplashScreen:

Page 4 Tutorial EGFE JARC SEAMEO-SEAMOLEC

setImage Image Background

setNext

Display to Next Display Constructor Set durasi detik 1 to n Running SplashScreen

action Untuk menjalankan splash screen harus memanggil method action dengan melewatkan parameter bertipe integer dimana parameter tidak digunakan sebagai rule, sehingga nilai yang diberikan tidak berpengaruh terhadap taks yang akan dijalankan dalam object ini. Berikut ini adalah potongan kode program penggunaan class SplashScreen:
private SplashScreen splash; display = Display.getDisplay(this); // Selang waktu 1 detik Pada saat splashscreen tampil splash = new SplashScreen(1); splash.setImage("/gambar/splashScreen.png"); // inisialisasi semua yang berkairtan dengan main menu initMainMenu(); splash.setNext(display, mainMenu); splash.action(0);

Page 5 Tutorial EGFE JARC SEAMEO-SEAMOLEC

MainMenu Setiap aplikasi game tidak luput dari main menu yang menggabungkan beberapa informasi dalam satu tampilan untuk memberikan kemudahan kepada user saat menjalankan aplikasi. Beberapa informasi yang sering ditampilkan di dalam main menu diantaranya adalah start game, setting, help, about dan exit. Semua informasi tersebut dapat di register kedalam class main menu dengan syarat class yang di daftarkan harus mengimplementasi interface Action agar dapat di parsing oleh object main menu. Berikut ini adalah penjelasan tentang fungsi-fungsi yang telah disediakan dalam class MainMenu: Method Constructor Keterangan

Constructor MainMenu melewatkan dua buah parameter bertipe Display dan String. - display untuk menampilkan pada screen aplikasi - locationBgImage Lokasi penyimpanan gambar yang digunakan sebagai background image void setSleepTime Menentukan waktu sleep dari sebuah thread dengan (long sleepTime) sebuah parameter bertipe long apabila method ini tidak digunakan maka default sleepnya adalah 20ms. - sleepTime waktu sleep dalam satuan milidetik long getSleepTime() Mengembalikan nilai sleep yang diset sebelumnya void Mendaftarkan image dan aksi dari masing -masing setMenu(Image sub menu imageSubmenu[], Action - imageSubmenu daftar image yang akan di nextAction[]) gambar sebagai sub menu - nextAction daftar class yang akan di jalankan setelah memilih sub menu void Menentukan posisi sub menu yang aktif setCurrentPos(int currentPos) - currentPos index posisi menu Int getCurrentPos() Mengembalikan posisi sub menu yang aktif void Menentukan kooardinat awal untuk penggambaran setPositionSubMenu(int xPos, image submenu int yPos) - xPos koordinat x - yPos koordinat y void Menentukan jarak masing-masing submenu setDistSubmenu(int dist) - dist jarak submenu void start() Menjalankan proses pada mainmenu void stop() Menghentikan proses pada object MainMenu void action(int action) Menjalankan aksi pada object MainMenu - action digunakan sebagai rule Object MainMenu dapat diintegrasikan dengan splash screen sehingga tidak perlu lagi ada pemanggilan method action secara manual, namun apabila ingin Page 6 Tutorial EGFE JARC SEAMEO-SEAMOLEC

melakukan langsung tampilan main menu tanpa didahului atau di integrasi dengan splash screen maka harus memanggil method action, parameter yang dilewatkan tidak berpengaruh terhadap task yang dijalankan karena class MainMenu tidak mendefinisikan task didalam method action. Berikut ini adalah ilustrasi melewatkan parameter pada method setSubmenu. setSubmenu
ListImage on/off ListAction Next Action A Next Action B Next Action C Next Action D Next Action E

Pada saat melewatkan list imageSubmenu dan list nextAaction pada method setSubmenu yang perlu diperhatikan adalah jumlah image dan jumlah next action, sebagai contoh apabila terdapat 6(enam) buah sub menu maka harus terdapat 12(dua belas) buah image dimana 6(enam) image pertama digunakan sebagai gambar off dan selanjutnya on, sedangkan untuk list nextAction cukup mendaftarkan 6(enam) aksi saja yang akan di register atau diinisialisasi pada masing-masing sub menu. Gambar dibawah ini menunjukan ilustrasi fungsi method yang disediakan di dalam class MainMenu: Image Background setPositionSubMenu
If Fire Pressed Then Next Action

setCurrentPos(1)

Active Submenu

setDistSubmenu

Page 7 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Apabila di dalam list nextAction terdapat index array yang tidak di inisialisasi maka tidak akan terjadi proses apapun ketika memilih submenu pada index tersebut(ketika timbol fire ditekan). Berikut ini adalah potongan kode program pembuatan object MainMenu:
public void initMainMenu() { try { mainMenu = new MainMenu(display, "/gambar/bg_menu.png"); // Load gambar sebagai sub menu on dan off subMenu = new Image[10]; subMenu[0] = Image.createImage("/gambar/StartGame_off.png"); subMenu[1] = Image.createImage("/gambar/score_off.png"); subMenu[2] = Image.createImage("/gambar/Help_off.png"); subMenu[3] = Image.createImage("/gambar/About_off.png"); subMenu[4] = Image.createImage("/gambar/Exit_off.png"); subMenu[5] = Image.createImage("/gambar/StartGame_on.png"); subMenu[6] = Image.createImage("/gambar/score_on.png"); subMenu[7] = Image.createImage("/gambar/Help_on.png"); subMenu[8] = Image.createImage("/gambar/About_on.png"); subMenu[9] = Image.createImage("/gambar/Exit_on.png"); // List Action Main Menu nextDisplay = new Action[6]; nextDisplay[0] = new GamePlay(this); nextDisplay[1] = highScore; nextDisplay[2] = bantuan; nextDisplay[3] = about; nextDisplay[4] = this; /** * Mendaftarkan list image melalui variable submenu & actionnya * pada nextDisplay dimana banyaknya array pada subMenu harus * sama dengan nextDisplay */ mainMenu.setSubmenu(subMenu, nextDisplay); // Set posisi awal penggambaran mainMenu.setPositionSubMenu(50, 75); // Set jarak masing-masing submenu mainMenu.setDistSubmenu(40); } catch (IOException ex) { } }

Page 8 Tutorial EGFE JARC SEAMEO-SEAMOLEC

HighScore Hampir dalam setiap permainan terdapat catatan untuk tiap-tiap score yang diraih oleh seorang player setelah memainkan sebuah game, score yang disimpan biasanya dibatasi dalam jumlah tertentu dan hanya beberapa score tertinggi yang ditambahkan dalam sebuah record. Class HighScore dapat melakukaan fungsi yang telah di uraikan di atas dan melakukan penyimpanan data nilai tertinggi dalam sebuah RMS, class ini juga dapat diintegrasikan dengan class GFEInfo untuk menampilkan informasi dalam bentuk grafis yang akan di bahas pada bab selanjutnya. Berikut ini adalah keterangan fungsi-fungsi yang telah disediakan oleh class HighScore: Method Constructor Keterangan Constuctor HighScore melewatkan empat buah parameter. - recordName nama record yang digunakan sebagai media penyimpanan - rows banyaknya baris record yang akan di simpan - cols banyaknya kolom record yang akan di simpan - scoreIndex indeks aray untuk mendefinisikan score(nilai) Menambahkan score dalam RMS. - value data yang akan ditambahkan sebagai record dalam bentuk array satu dimensi Memeriksa data yang ditambahkan kedalam record - value data yang akan ditambahkan sebagai record dalam bentuk array satu dimensi @return data array apabila layak ditambahkan kedalam record store dan selain itu null Mengembalikan score berupa array dua dimensi Menutup Record HighScore

void addScore(String[] value)

String[][] checkScore(String value[])

String[][] getHighScore() void close()

Parameter recordName yang dilewatkan pada constructor HighScore akan secara otomatis dibuat apabila ternyata nama record belum ada dan hak aksesnya dibatasi hanya di dalam midlet-suite yang bersangkutan tanpa ada interferensi dari midlet-suite yang lain guna keamanan data yang ada di dalamnya. Selain itu untuk menambahkan data kedalam RMS sebaiknya memerikasa data terlebih dahulu apakah layak ditambahkan atau tidak dengan cara memanggil method checkScore() apabila nilai kembaliannya tidak sama dengan null maka data dapat ditambahkan melalui method addHighScore(.). Berikut ini adalah gambar ilustrasi pembuatan object HighScore: Page 9 Tutorial EGFE JARC SEAMEO-SEAMOLEC

recordName
budy adi rows=5 nina rifki indah 100 50 45 30 20

scoreIndex=1

String nama[] = new String[2]; nama[0] = "adi"; nama[1] = "50"; addScore(nama);

cols=2

Parameter scoreIndex merupakan index kolom yang akan digunakan sebagai ordering dimana nilai pada index ini harus bilangan numeric ketika menambahkan data walaupun disimpan di dalam array bertipe String (contoh:nama[1]=50). Berikut ini adalah potongan kode program untuk pembuatan object HighScore:
public void writeHighScore() { HighScore hc = new HighScore("dbHighScore", 5, 2, 1); String nama[] = new String[2]; nama[0] = " adi "; nama[1] = "" + score; hc.addScore(nama); // menampilkan isi high score String ni[][] = hc.getHighScore(); for (int i = 0; i < ni.length; i++) { System.out.println(""); for (int j = 0; j < ni[0].length; j++) { System.out.print(ni[i][j]); } } System.out.println(""); }

Page 10 Tutorial EGFE JARC SEAMEO-SEAMOLEC

GFEInfo Class GFEInfo berfungsi untuk menyediakan informasi seperti tampilan about, help dan high score dalam bentuk grafis, sehingga kelihatan lebih menarik dibandingkan dengan menggunakan Form dari midlet. Contructor GFEInfo melewatkan dua buah parameter yaitu Display untuk mengatur tampilan dalam aplikasi dan Displayable untuk tampilan selanjutnya ketika ditekan tombol Back. Berikut ini adalah list method yang tersedia di dalam class GFEInfo: Method setHeader setBody setFooter setHighScore Keterangan Melewatkan sebuah parameter bertipe Image yang digunkan sebagai header dalam canvas Melewatkan sebuah parameter bertipe Image yang digunkan sebagai body dalam canvas Melewatkan sebuah parameter bertipe Image yang digunkan sebagai footer dalam canvas Menjadikan informasi yang ditampilkan berupa highscore - highScore object HighScore yang akan ditampilkan - yPos posisi awal koordinat Y untuk penggambaran - xPos posisi awal koordinat X untuk penggambaran - dist jarak antar baris score masing-masing

Class GFEInfo ini mengimplementasi Interface Action sehingga dapat dilewatkan sebagai sebuah menu di dalam class MainMenu. Ilustrasi implementasi class GFEInfo ini dapat di lihat pada gambar berikut ini.

Image A setHeader Image B

setBody setFooter

Image C

Ketika tombol Back di tekan langsung menuju keNext Display Ilustrasi implementasi class GFEInfo Page 11 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Setelah melihat ilustrasi pada gambar di atas maka potongan kode programnya dapat dituliskan sebagai berikut:
// Information Help GFEInfo bantuan = new GFEInfo(display, mainMenu); bantuan.setHeader(Image.createImage("/gambar/Help_Header.png")); bantuan.setBody(Image.createImage("/gambar/Help_Body.png")); bantuan.setFooter(Image.createImage("/gambar/Back.png")); // didaftarkan sebagai list di dalam Main Menu pada index ke 4 nextDisplay[3] = bantuan;

Pada class GFEInfo juga terdapat method setHighScore yang berfungsi untuk menampilkan informasi high score yang melewatkan object HighScore sebagai parameternya beserta posisi koordinat penggambarannya dalam sebuah canvas. Berikut ini adalah ilustrasi penggunaan high score. setHighScore xPos = Int[]{10,120}

Nama budy adi

Score 100 50 45 30 20

yPos=10

List Score

nina rifki indah

dist=20

Ketika tombol Back di tekan langsung menuju keNext Display

Implementasi class GFEInfo sebagai HighScore

Page 12 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Method setHighScore meleweatkan parameter highScore yang merupakan array dua dimensi bertipe data HighScore, data yang tampil di peroleh melalui class HighScore dengan memanggil method getHighScore seperti yang telah diuraikan pada pada bahasan sebelumnya. Berikut ini adalah potongan kode program untuk pembuatan tampilan high score.
// HighScore GFEInfo highScore = new GFEInfo(display, mainMenu); highScore.setHeader(Image.createImage("/gambar/Score_Header.png")); highScore.setBody(Image.createImage("/gambar/Score_Body.png")); highScore.setFooter(Image.createImage("/gambar/Back.png")); // Inisialisasi object high score HighScore hc = new HighScore("dbHighScore", 5, 2, 1); int colsPosition[] = {25, 145}; highScore.setHighScore(hc, colsPosition, 40, 20); // didaftarkan sebagai list di dalam Main Menu pada index ke 5 nextDisplay[4] = highScore;

Page 13 Tutorial EGFE JARC SEAMEO-SEAMOLEC

GFERandom Class GFERandom terletak pada package egfe.utils.GFERandom yang berfungsi untuk melakukan pembangkitkan bilangan acak, class ini sangat membantu pada saat pengacakan sekumpulan soal maupun gambar dan semua kegiatan yang berkaitan dengan pengacakan. Class ini menghasilkan output berupa array bertipe int yang sudah di acak. Berikut ini adalah keterangan method yang tersedia di dalam class GFERandom. Method Constructor Keterangan Melewatkan sebuah parameter sebagai mode random - GFERandom.MODE1 nilai tidak ada yang duplikat - GFERandom.MODE2 nilai boleh duplikat - GFERandom.MODE3 nilai boleh diplikat dengan syarat ada batasan duplikatnya

void Menentukan banyaknya bilangan yang akan di acak setSource(int num) void Menentukan banyaknya jumlah yang akan di hasilkan setDestination(int num) int[] getResult() Mengembalikan nilai berupa array dengan nilai yang sudah di acak void Menentukan mode pengacakan setMode(int mode) - GFERandom.MODE1 nilai tidak ada yang duplikat - GFERandom.MODE2 nilai boleh duplikat - GFERandom.MODE3 nilai boleh diplikat dengan syarat ada batasan duplikatnya int getMode() Mengembalikan nilai mode random yang digunakan void Menentukan banyaknya kemungikan nilai yang duplikat setMaxDuplicate(int pada saat pengacakan, bagian ini di set apabila memilih duplicate) GFERandom.MODE3 void rand() Melakukan pembangkitan bilangan acak sesuai dengan source, destination dan mode yang ditentukan static int Membangkitkan bilangan acak randomInt(int next) - next batas jumlah tertinggi angka yang diacak @return nilai bilangan acak Metode yang digunakan dalam melakukan pengacakan pada class GFERandom adalah dengan memanfaatkan index array dan kemudian di simpan dalam bentuk array satu dimensi sebagai nilai outputnya, oleh sebab itu data yang akan di acak harus di mapping terlebih dahulu ke dalam bentuk array dengan dimensi array disesuaikan dengan kebutuhan. Berikut ini adalah gambar ilustrasi penggunaan GFERandom:

Page 14 Tutorial EGFE JARC SEAMEO-SEAMOLEC

rand() setSource(10) setDest(5)

Index array yang akan di acak 0-9 Hasil pengacakan index array (5 elemen)

Mapping Data getResult()

Process Selanjutnya

Seperti yang terlihat pada gambar di atas bahwa parameter yang dilewatkan pada method setSource() merupakan jumlah elemen array yang akan di acak dari index 0 s/d n-1, sedangkan setDest() merupakan jumlah elemen array yang dihasilkan atau dibutuhkan untuk pengambilan index array acak dengan ketentuan sebagai berikut: 1. Apabila memilih MODE1, maka nilai yang dilewatkan pada method setDest tidak boleh lebih dari nilai yang dilewatkan pada method setSource . 2. Apabila memilih MODE2, maka nilai yang dilewatkan pada method setDest boleh melebihi nilai yang dilewatkan pada method setSource . 3. Apabila memilih MODE3, maka nilai yang dilewatkan pada method setDest tidak boleh lebih dari 2*nilai yang dilewatkan pada method setSource . Secara otomatis jumlah duplikasi untuk pengacakan di set dengan nilai 2(dua) apabila memilih MODE3 dan tidak memanggil atau memberikan nilai pada method setMaxDuplicate(). Selain itu class GFERandom menyediakan method static untuk pengacakan yang dapat di call dengan cara GFERandom.randomInt() dimana parameternya merupakan batas nilai tertinggi kemunculan data. Berikut ini adalah potongan kode program contoh penggunaan class GFERandom:

Page 15 Tutorial EGFE JARC SEAMEO-SEAMOLEC

// inisialisasi object rand = new GFERandom(GFERandom.MODE1); rand.setSource(6); rand.setDestination(6); // Random jawaban yang akan ditampilkan rand.rand(); soal = rand.getResult(); // Mengambil image berdasarkan index yang telah diacak imageJawaban = gpm.getImageJawaban()[gpm.getJawaban()[soal[i]]]; // Random soal yang akan ditampilkan indexSoalJawab = soal[GFERandom.randomInt(soal.length)]; imageSoal = gpm.getImageSoal()[indexSoalJawab];

Instantiate object yang hanya sekali di panggil pada saat pembuatan object, kemudian random jawaban yang akan di panggil apabila diperlukan pengacakan soal yang disesuaikan dengan kebutuhan melalui method rand() dan mengambil hasil bilangan acak melalui method getResult(). Selanjutnya user dapat memproses atau menerapkan hasil bilangan acak pada suatu data yang sudah di mapping ke dalam bentuk array baik berupa soal, gambar, dst.

Page 16 Tutorial EGFE JARC SEAMEO-SEAMOLEC

SoundManager Bermain tanpa adanya suara merupakan hal yang dapat menyebabkan kebosanan terhadap seorang user/player, untuk itu dibuatlah sebuah class yang khusus menangani suara. Berikut ini adalah fungsi-fungsi yang terdapat di dalam class SoundManager: Method Constructor Keterangan Melewatkan sebuah parameter berupa array dua dimensi - listFileName Daftar lokasi penyimpanan suara dan tipe nya yang dapat berupa MIDI maupun WAV Menentukan volume suara - volume nilai volume suara yang akan dimainkan Memainkan sebuah file suara dengan menentukan index mapping datanya - index index suara yang akan dimainkan - loopCount menentukan berapa kali suara akan dimainkan Memeriksa suara apakah masih di mainkan atau tidak - index index suara yang akan di periksa @return true apabila file suara masih di mainkan Menghentikan suara - index index suara yang akan dihentikan

void setVolume(int volume) void play(int index, int loopCount)

boolean isPlay(int index) void stop(int index)

SoundManager melewatkan parameter berupa array dua dimensi yang isi index pertamnya adalah lokasi penyimpanan file dan index kedua adalah tipe suara yang dapat diinisialisasi langsung dengan memanggil field static SoundManager.MIDI atau SoundManager.WAV. Berikut ini adalah protongan kode program penggunaan class SoundManager.
//Inisialisasi suara String a[][] = {{"/gentar.mid", SoundManager.SOUND_MIDI}, {"/explode.wav", SoundManager.SOUND_WAVE} }; sm = new SoundManager(a); -------------------------------------------sm.play(0, 1); //memainkan file suara -------------------------------------------sm.stop(0); //Menghentikan suara

Page 17 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Referensi 1. Knudsen Jonathan, 2003, Wireless Java Developing with J2ME Second Edition, Apress Publisher. 2. Jeni Team, 2007, Modul JENI 2, Java Education Network Indonesia Center VEDC Malang. 3. Jeni Team, 2007, Modul JENI 4, Java Education Network Indonesia Center VEDC Malang.

Page 18 Tutorial EGFE JARC SEAMEO-SEAMOLEC

Lampiran Source Program: Class Main


/* * @(#)Main.java 1.0 * * Copyright 2009 SEAMEO SEAMOLEC, All rights reserved. * Game For Education. */ import import import import import import import import import egfe.GFEInfo; egfe.SplashScreen; egfe.MainMenu; egfe.Action; egfe.HighScore; java.io.IOException; javax.microedition.lcdui.Display; javax.microedition.lcdui.Image; javax.microedition.midlet.*;

/** * @author Sajarwo Anggai * @author Abdul Rizal Adompo * @version 1.0, 11 May 2009 */ public class Main extends MIDlet implements Action { private Display display; private SplashScreen splash; public MainMenu mainMenu; private Image[] subMenu; private Action[] nextDisplay; public void startApp() { display = Display.getDisplay(this); // Selang Waktu 1detik Pada saat splashscreen tampil splash = new SplashScreen(1); splash.setImage("/gambar/splashScreen.png"); // inisialisasi semua yang berkairtan dengan main menu initMainMenu(); splash.setNext(display, mainMenu); splash.action(0); } public void initMainMenu() { try { mainMenu = new MainMenu(display, "/gambar/MainMenu.png"); // Load gambar sebagai sub menu on dan off subMenu = new Image[10];

Page 19 Tutorial EGFE JARC SEAMEO-SEAMOLEC

subMenu[0] subMenu[1] subMenu[2] subMenu[3] subMenu[4] subMenu[5] subMenu[6] subMenu[7] subMenu[8] subMenu[9]

= = = = = = = = = =

Image.createImage("/gambar/StartGame_off.png"); Image.createImage("/gambar/score_off.png"); Image.createImage("/gambar/Help_off.png"); Image.createImage("/gambar/About_off.png"); Image.createImage("/gambar/Exit_off.png"); Image.createImage("/gambar/StartGame_on.png"); Image.createImage("/gambar/score_on.png"); Image.createImage("/gambar/Help_on.png"); Image.createImage("/gambar/About_on.png"); Image.createImage("/gambar/Exit_on.png");

// Information Help GFEInfo bantuan = new GFEInfo(display, mainMenu); bantuan.setHeader(Image.createImage("/gambar/Help_Header.png")); bantuan.setBody(Image.createImage("/gambar/Help_Body.png")); bantuan.setFooter(Image.createImage("/gambar/Back.png")); // Information About GFEInfo about = new GFEInfo(display, mainMenu); about.setHeader(Image.createImage("/gambar/Help_Header.png")); about.setBody(Image.createImage("/gambar/About_Body.png")); about.setFooter(Image.createImage("/gambar/Back.png")); // HighScore GFEInfo highScore = new GFEInfo(display, mainMenu); highScore.setHeader(Image.createImage("/gambar/Score_Header.png")); highScore.setBody(Image.createImage("/gambar/Score_Body.png")); highScore.setFooter(Image.createImage("/gambar/Back.png")); HighScore hc = new HighScore("dbHighScore", 5, 2, 1); int colsPosition[] = {25, 145}; highScore.setHighScore(hc, colsPosition, 40, 20); // List Action Main Menu nextDisplay = new Action[6]; nextDisplay[0] = new GamePlay(this); nextDisplay[1] = highScore; nextDisplay[2] = bantuan; nextDisplay[3] = about; nextDisplay[4] = this; /** * Mendaftarkan list image melalui variable submenu & actionnya * pada nextDisplay dimana banyaknya array pada subMenu harus sama * dengan nextDisplay */ mainMenu.setSubmenu(subMenu, nextDisplay); mainMenu.setPositionSubMenu(50, 75); // Set posisi awal penggambaran mainMenu.setDistSubmenu(40); // Set jarak masing-

Page 20 Tutorial EGFE JARC SEAMEO-SEAMOLEC

masing submenu } catch (IOException ex) { } } // Aksi ini akan dipanggil oleh main menu apabila terdaftar pada list actionnya public void action(int action) { destroyApp(true); } public Display getDisplay() { return display; } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } }

Class GamePlay
/* * @(#)GamePlay.java 1.0 * * Copyright 2009 SEAMEO SEAMOLEC, All rights reserved. * Game For Education. */ import import import import import import import import import import import import import egfe.utils.GFERandom; egfe.Action; egfe.HighScore; egfe.utils.GFEUtils; egfe.utils.SoundManager; java.io.IOException; java.util.Timer; java.util.TimerTask; javax.microedition.lcdui.Graphics; javax.microedition.lcdui.Image; javax.microedition.lcdui.game.GameCanvas; javax.microedition.lcdui.game.LayerManager; javax.microedition.lcdui.game.Sprite;

/** * * @author Sajarwo Anggai * @author Abdul Rizal Adompo * @version 1.0, 02 September 2009 */

Page 21 Tutorial EGFE JARC SEAMEO-SEAMOLEC

public class GamePlay extends GameCanvas implements Action, Runnable { private Main m; private LayerManager lm; private Sprite jawaban[]; private int soal[]; private int indexSoalJawab = -1; private int currentPos = 0; private GFERandom rand; private Image bg_player; private Sprite spriteSoal; private Image imageSoal; private Image imageJawaban; private GamePlayMapping gpm; private Timer t; private Waktu task; private boolean stop; private int score = 0, limitQuiz = 5, countQuiz = 0; private EndGame endGame; private String pos[][] = {{"a", "b", "c"}, {"d", "e", "f"}}; private int position[] = new int[2]; private SoundManager sm; public GamePlay(Main m) { super(false); this.m = m; t = new Timer(); task = new Waktu(); task.setActive(false); t.schedule(task, 1000, 1000); endGame = new EndGame(m); //Inisialisasi suara String a[][] = {{"/gentar.mid", SoundManager.SOUND_MIDI}, {"/explode.wav", SoundManager.SOUND_WAVE}}; sm = new SoundManager(a); } public void init() { position[0] = 0; position[1] = 0; lm = new LayerManager(); lm.setViewWindow(0, 0, this.getWidth(), this.getHeight() + 200); rand = new GFERandom(GFERandom.MODE1); rand.setSource(6); rand.setDestination(6); jawaban = new Sprite[6]; gpm = new GamePlayMapping(); gpm.init(); try { bg_player = Image.createImage("/gambar/bg_player.png");

Page 22 Tutorial EGFE JARC SEAMEO-SEAMOLEC

} catch (IOException ex) { } } public void loadSprite() { // Random jawaban yang akan ditampilkan rand.rand(); soal = rand.getResult(); int x = 0, y = 80; for (int i = 0; i < jawaban.length; i++) { imageJawaban = gpm.getImageJawaban()[gpm.getJawaban()[soal[i]]]; if (jawaban[i] == null) { jawaban[i] = new Sprite(imageJawaban); jawaban[i].setVisible(true); jawaban[i].setPosition(x, y); } else { lm.remove(jawaban[i]); jawaban[i].setImage(imageJawaban, imageJawaban.getWidth(), imageJawaban.getHeight()); } lm.append(jawaban[i]); if ((i + 1) % 3 == 0) { x = 0; y += 80; } else { x += 80; } } // Random soal yang akan ditampilkan indexSoalJawab = soal[GFERandom.randomInt(soal.length)]; imageSoal = gpm.getImageSoal()[indexSoalJawab]; if (spriteSoal == null) { spriteSoal = new Sprite(imageSoal); spriteSoal.setVisible(true); spriteSoal.setPosition(70, 265); } else { lm.remove(spriteSoal); spriteSoal.setImage(imageSoal, imageSoal.getWidth(), imageSoal.getHeight()); } lm.append(spriteSoal); } public void draw(Graphics g) { g.setColor(255, 255, 255); g.fillRect(0, 0, getWidth(), getHeight()); g.drawImage(bg_player, 0, 0, 0); g.setColor(0, 0, 0); g.drawString("" + score, 120, 40, 0); g.drawString("" + task.getCount() + "s", 185, 40, 0); lm.paint(g, 0, 0);

Page 23 Tutorial EGFE JARC SEAMEO-SEAMOLEC

g.drawRect(position[1] * 80, position[0] * 80 + 80, 80, 80); if (task.getCount() <= 0) { stop = true; task.setActive(false); writeHighScore(); sm.stop(0); //Menghentikan suara endGame.action(0); } } protected void keyReleased(int keyCode) { GFEUtils.checkPointerPosition(pos, position, 1, 1, keyCode); if (keyCode == KEY_NUM5) { //sm.play(1, 1); countQuiz++; if (countQuiz >= 5) { stop = true; task.setActive(false); writeHighScore(); sm.stop(0); endGame.action(0); } else { score += 15; this.action(1); task.setCount(20); task.setActive(true); } } } public void run() { Graphics g = getGraphics(); while (!stop) { draw(g); flushGraphics(); try { Thread.sleep(50); } catch (InterruptedException ex) { } } } public void writeHighScore() { HighScore hc = new HighScore("dbHighScore", 5, 2, 1); String nama[] = new String[2]; nama[0] = "adi"; nama[1] = "" + score; hc.addScore(nama); // menampilkan isi high score String ni[][] = hc.getHighScore(); for (int i = 0; i < ni.length; i++) { System.out.println(""); for (int j = 0; j < ni[0].length; j++) { System.out.print(ni[i][j]);

Page 24 Tutorial EGFE JARC SEAMEO-SEAMOLEC

} } System.out.println(""); } public void action(int action) { stop = false; if (action == 0) { score = 0; countQuiz = 0; sm.play(0, 1); //memainkan file suara m.getDisplay().setCurrent(this); setFullScreenMode(true); new Thread(this).start(); } init(); loadSprite(); task.setCount(20); task.setActive(true); } } class Waktu extends TimerTask { private int count = 10; private boolean active; public void run() { if (active) { count--; } } public void setCount(int count) { this.count = count; } public int getCount() { return count; } void setActive(boolean active) { this.active = active; } }

Page 25 Tutorial EGFE JARC SEAMEO-SEAMOLEC

You might also like