Anda di halaman 1dari 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
Interface
HighScore Game
Main Menu Play
Utils
Splash Screen

Resource I/O Device

J2ME

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
env
Action
Images
SplashScreen
utils
MainMenu
GFERand
HighScore
SoundManager
GFEInfo
Keterangan:
Package
Interface
Class
Implement MainMenuAction

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
action(int)
Rules (if) Task C

Task to-N

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 Keterangan
Constructor 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 setNext

Image Background

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 Keterangan
Constructor 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 Keterangan
Constructor 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)
void addScore(String[] value) Menambahkan score dalam RMS.
- value data yang akan ditambahkan sebagai
record dalam bentuk array satu dimensi
String[][] Memeriksa data yang ditambahkan kedalam record
checkScore(String value[]) - 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
String[][]
Mengembalikan score berupa array dua dimensi
getHighScore()
void close() Menutup Record HighScore
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 scoreIndex=1

budy 100

adi 50 String nama[] = new String[2];

rows=5 nina 45 nama[0] = "adi";

rifki 30 nama[1] = "50";

indah 20 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 Keterangan
setHeader Melewatkan sebuah parameter bertipe Image yang digunkan
sebagai header dalam canvas
setBody Melewatkan sebuah parameter bertipe Image yang digunkan
sebagai body dalam canvas
setFooter Melewatkan sebuah parameter bertipe Image yang digunkan
sebagai footer dalam canvas
setHighScore 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

setBody Image B

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 Score yPos=10


budy 100
adi 50
List Score nina 45
rifki 30
dist=20
indah 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 Keterangan
Constructor 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
Index array yang
rand()
akan di acak 0-9
setSource(10)

Hasil pengacakan
setDest(5) 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 Keterangan
Constructor Melewatkan sebuah parameter berupa array dua dimensi
- listFileName Daftar lokasi penyimpanan suara dan tipe
nya yang dapat berupa MIDI maupun WAV
void Menentukan volume suara
setVolume(int volume) - volume nilai volume suara yang akan dimainkan
void Memainkan sebuah file suara dengan menentukan index
play(int index, mapping datanya
int loopCount) - index index suara yang akan dimainkan
- loopCount menentukan berapa kali suara akan
dimainkan
boolean Memeriksa suara apakah masih di mainkan atau tidak
isPlay(int index) - index index suara yang akan di periksa
@return true apabila file suara masih di mainkan
void stop(int index) Menghentikan suara
- index index suara yang akan dihentikan

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 egfe.GFEInfo;
import egfe.SplashScreen;
import egfe.MainMenu;
import egfe.Action;
import egfe.HighScore;
import java.io.IOException;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Image;
import 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] = 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");

// 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 egfe.utils.GFERandom;
import egfe.Action;
import egfe.HighScore;
import egfe.utils.GFEUtils;
import egfe.utils.SoundManager;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import 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

Anda mungkin juga menyukai