Pemrograman Game Sederhana J2ME
Pemrograman Game Sederhana J2ME
I. Design Program
a. Pertama design visual midlet pada netbeans terlebih dahulu seperti gambar di
bawah ini.
Gambar di atas untuk mengisi background, karakter laba-laba, bola, dan juga
wadah pada saat game akan di mainkan, perhatikan nama pada gambar
tersebut karena berhubungan pada saat penggunaan variable di dalam
program nanti. Selanjutnya kita akan masuk ke tahap pemrograman.
c. Ketiga tahap memasukan program game pada kelas java.
Pada saat pemrograman ada beberapa tahapan yang harus kita lewati
dalam pembuatan program game. Pertama kita akan meloading semua
karakter sprite ke dalam screen, kedua menggerakan sprite laba-laba, ketiga
mengabil, membawa dan menyatukan bola sesuai warna, keempat
penilaian, dan yang kelima countdown dan notifikasi menang/kalah.
Langsung saja ke tahap yang pertama yaitu program untuk meloading
semua karakter sprite ke dalam screen.
package hello;
import java.io.IOException;
import java.util.Random;
Sprite sprite_bola[] = new Sprite[8]; ( ini adalah array untuk menginput bola yang kita
masukan tadi)
String nama_bola[] =
{"biru","Coklat","Hijau","Hitam","Kuning","Merah","Orange","Ungu"};
TiledLayer background;
LayerManager layer_manager;
GameDesign game_design;
Random r = new Random(); (ini adalah variable untuk merandom bola dan lingkaran)
public Game(){
super(false);
try{
game_design = new GameDesign(); (ini adalah penambahan variable game design)
sprite_laba = game_design.getLabalaba(); (ini penambahan variable sprite laba-laba)
layer_manager = new LayerManager(); (ini untuk variable layer manager)
background = game_design.getBackground();
game_design.updateLayerManagerForScene(layer_manager);
}catch(IOException ex){}
acakBolaDanLingkaran();
start();
}
public int getRandomNumber(int maks){ (ini adalah perintah untuk merandom bola
dan lingkaran)
int a = r.nextInt()%maks;
if(a<0)
a*=-1;
return a;
}
public void acakBolaDanLingkaran(){
for(int i=0; i<sprite_bola.length;i++){
int x = getRandomNumber(background.getWidth());
int y = getRandomNumber(background.getHeight());
sprite_bola[i].setPosition(x, y);
}
for(int i=0; i<sprite_lingkaran.length;i++){
int x = getRandomNumber(background.getWidth());
int y = getRandomNumber(background.getHeight());
sprite_lingkaran[i].setPosition(x, y);
}
}
}
Setelah program di atas selesai kita baru saja merandom bola dan
lingkaran pada screen. Selanjutnya kita akan melaju ke tahap berikutnya
yaitu menggerakan laba-laba, mengambil dan menyatukan warna bola dan
wadah, penilaian, dan countdown serta hasil win/lose.
package hello;
import java.io.IOException;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
TiledLayer background;
LayerManager layer_manager;
GameDesign game_design;
boolean is_play;
int last_direction;
background = game_design.getBackground();
game_design.updateLayerManagerForScene(layer_manager);
}catch(IOException ex){}
acakBolaDanLingkaran();
start();
}
}
adjustScreen();
drawScreen(g);
if(time<0){
is_play = false;
timer.cancel();
}
try{
Thread.sleep(30);
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
}
public void drawScreen(Graphics g){
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
layer_manager.paint(g, 0, 0);
g.setColor(0, 0, 0);
g.drawString("Score: "+score, getWidth(), 0, Graphics.RIGHT | Graphics.TOP);
g.drawString("Time left: "+time, 0, 0, Graphics.LEFT | Graphics.TOP);
flushGraphics();
}
public void moveCharacter(int direction){
if(last_direction != direction){
switch(direction){
case UP:
sprite_laba.setFrameSequence(game_design.labalaba_top);
break;
case DOWN:
sprite_laba.setFrameSequence(game_design.labalaba_bottom);
break;
case LEFT:
sprite_laba.setFrameSequence(game_design.labalaba_left);
break;
case RIGHT:
sprite_laba.setFrameSequence(game_design.labalaba_right);
break;
}
last_direction = direction;
}
switch(direction){
case UP:
if (sprite_laba.getY()-2>0){
sprite_laba.move(0, -2);
}
break;
case DOWN:
if(sprite_laba.getX()+2 < background.getHeight()){
sprite_laba.move(0, 2);
}
break;
case LEFT:
if(sprite_laba.getX()-2>0){
sprite_laba.move(-2, 0);
}
break;
case RIGHT:
if(sprite_laba.getX()+2 < background.getWidth()){
sprite_laba.move(2, 0);
}
break;
}
sprite_laba.nextFrame();
}
public void input(){
int states = getKeyStates();
if((states & UP_PRESSED)!=0){
moveCharacter(UP);
}
if((states & DOWN_PRESSED)!=0){
moveCharacter(DOWN);
}
if((states & LEFT_PRESSED)!=0){
moveCharacter(LEFT);
}
if((states & RIGHT_PRESSED)!=0){
moveCharacter(RIGHT);
}
}
public void adjustScreen(){
int xmax = getWidth()-40;
int ymax = getHeight() - 40;
int xmin = 20;
int ymin = 20;
int viewX = 20;
int viewY = 20;
if(sprite_laba.getX()>viewX+xmax){
viewX = sprite_laba.getX()-xmax;
if(viewX+getWidth()>background.getWidth()){
viewX = background.getWidth()-getWidth();
}
}
if(sprite_laba.getY()>viewY+ymax){
viewY = sprite_laba.getY()-ymax;
if(viewY+getHeight()>background.getHeight()){
viewY = background.getHeight()-getHeight();
}
if(sprite_laba.getX()<viewX+xmax){
viewX = sprite_laba.getX()-xmin;
if(viewX < 0){
viewX = 0;
}
}
if(sprite_laba.getY()<viewY+ymin){
viewY = sprite_laba.getY()-ymin;
if(viewY<0){
viewY = 0;
}
}
layer_manager.setViewWindow(viewX, viewY, getWidth(), getHeight());
}
public void keyPressed(int keyCode){
int action = getGameAction(keyCode);
if(action == FIRE){
if(is_bringing_theball == false){
for(int i = 0; i<sprite_bola.length;i++){
if(sprite_laba.collidesWith(sprite_bola[i], true)){
index_bola_yg_dibawa = i;
index_lingkaran_yg_tersedia = i;
is_bringing_theball = true;
break;
}
}
}else{
if(is_bringing_theball == true){
if(action == FIRE){
if(sprite_bola[index_bola_yg_dibawa].collidesWith(sprite_lingkaran[index_lingkaran_y
g_tersedia], true)){
sprite_bola[index_bola_yg_dibawa].setVisible(false);
sprite_lingkaran[index_lingkaran_yg_tersedia].setVisible(false);
score += 10;
}
else{
score -= 10;
}
}
is_bringing_theball = false;
}
}
}
}
public void startTimer(){
time = 120;
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
}, 1000, 1000);
}
public void drawOverScreen(Graphics g){
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD |
Font.STYLE_UNDERLINED, Font.SIZE_LARGE));
if(score == 80){
g.setColor(0, 255, 0);
g.drawString("YOU WIN", getWidth()/2, getHeight()/2,Graphics.HCENTER
| Graphics.BOTTOM);
}else{
g.setColor(255, 0, 0);
g.drawString("You LOSE", getWidth()/2, getHeight()/2, Graphics.HCENTER
| Graphics.BOTTOM);
}
flushGraphics();
}
}
}
last_direction = direction;
}
switch(direction){
case UP:
if (sprite_laba.getY()-2>0){
sprite_laba.move(0, -2);
}
break;
case DOWN:
if(sprite_laba.getX()+2 < background.getHeight()){
sprite_laba.move(0, 2);
}
break;
case LEFT:
if(sprite_laba.getX()-2>0){
sprite_laba.move(-2, 0);
}
break;
case RIGHT:
if(sprite_laba.getX()+2 < background.getWidth()){
sprite_laba.move(2, 0);
}
break;
}
sprite_laba.nextFrame();
}
public void input(){
int states = getKeyStates();
if((states & UP_PRESSED)!=0){
moveCharacter(UP);
}
if((states & DOWN_PRESSED)!=0){
moveCharacter(DOWN);
}
if((states & LEFT_PRESSED)!=0){
moveCharacter(LEFT);
}
if((states & RIGHT_PRESSED)!=0){
moveCharacter(RIGHT);
}
}
Untuk perintah mengambil dan membawa bola sesuai warna kita perlu
ketikan program berikut :
if(sprite_bola[index_bola_yg_dibawa].collidesWith(sprite_lingkaran[index_lingkara
n_yg_tersedia], true)){
sprite_bola[index_bola_yg_dibawa].setVisible(false);
sprite_lingkaran[index_lingkaran_yg_tersedia].setVisible(false);
score += 10;
}
else{
score -= 10;
}
}
Untuk countdown dan notifikasi menang/kalah kita masukkan program
berikut:
}, 1000, 1000);
}
public void drawOverScreen(Graphics g){
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD |
Font.STYLE_UNDERLINED, Font.SIZE_LARGE));
if(score == 80){
g.setColor(0, 255, 0);
g.drawString("YOU WIN", getWidth()/2, getHeight()/2,Graphics.HCENTER
| Graphics.BOTTOM);
}else{
g.setColor(255, 0, 0);
g.drawString("You LOSE", getWidth()/2, getHeight()/2, Graphics.HCENTER
| Graphics.BOTTOM);
Setelah semua program di ketikkan selanjut nya kita menambahkan form
game yang sudah kita buat ke dalam visual midlet seperti gambar di atas tadi
untuk mengarahkan jika kita memilih tombol play pada mainmenu.
Perhatikan tanda panah dari form main menu play kea rah game yang
sudah kita buat programnya di atas. Setelah semua di set dengan benar
jalankan program game tersebut.
BAB II
Lanjutan dari bab 1 flatform yang digunakan adalah visual midlet, game
builder, dan juga java class yang berisikan program. Berikut adalah
flowchart pada saat visual midlet untuk mendesign tampilan awal platform
J2ME di jalankan :
Variabel :
SplashScreen
Main Menu
Help Form
About FOrm
C SplashScreen
Play
Yes Help
IF
D Main About
Menu
Exit
N
O
A
C
A
Yes
IF
Play Game
B
N
O
Yes
IF
Help Help Form
N Command Back
O
D
Yes
IF
About About Form
Command Back
N
O
D
B
Exit
End
Barikutnya adalah Flowchart dari program java class game :
Game Start
Variabel :
Laba-Laba
Bola
Wadah
Score
Time
Mulai Game
B
If laba Yes
memba
Masukkan ke dalam wadah
wa bola
N
O
B A
A
Yes
If score WIN
> 80
N
O
Lose END
BAB III
www.scribd.com/.../Pemrograman-Mobile-Mobile-Game
netbeans.org/community/releases/36/J2ME_Support.html
https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-
javase6-419409.html