Conducted by :
TEAM JARC
VERSION 1.0
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.
Game Aplication
Engine GFE
GFEInfo
Interface
HighScore Game
Main Menu Play
Utils
Splash Screen
J2ME
Page 1
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
Task A
No Rules Task B
action(int)
Rules (if) Task C
Task to-N
Page 3
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
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
setSubmenu
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
setDistSubmenu
Page 7
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");
…………………………………………………………………………………
/**
* 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);
Page 8
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
budy 100
indah 20 addScore(nama);
cols=2
Page 10
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
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.
Page 12
Page 13
Page 14
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
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
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
Page 18
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 {
splash.setNext(display, mainMenu);
splash.action(0);
}
Page 19
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);
/**
* 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
// Aksi ini akan dipanggil oleh main menu apabila terdaftar pada list
actionnya
public void action(int action) {
destroyApp(true);
}
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
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);
Page 22
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;
}
}
Page 23
Page 24
Page 25