TUTORIAL
PEMBUATAN GAME J2ME
Nama : Wiguno
budi r.
Nim : ( 100 40
174 )
Politeknik
Harapan bersama
tegal
TUTORIAL
PEMBUATAN GAME J2ME
A.MEmbuat
Game Dengan NetBeans
1.kIta
Harus Menyiapkan Gambar .png Terlebih Dahulu
2.Setelah disiapkan,Kita mulai
membuatnya dengan Netbean;
Step 1
masuk pada aplikasi NetBeans, selanjutnya pilih New Project akan muncul
tampilan seperti ini, lalu next.
Kita Pilih JavaME lalu Next.
Step
2 isi nama Project sesuai keinginan, contoh Muhammad_Muttaqien, lalu next.
Step
3 Kita plih MIDP-2.0 lalu finish.
Step
4 setelah finish akan tampil seperti gambar dibawah ini, klik kanan pada Soucre
Packages, pilih New lalu pilih MIDlet….
Step
5 beri nama Class, missal MIDlet, kemudian finish.
Lalu kiya isikan scrip ddlm MIDlet
tsbt
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
import
javax.microedition.midlet.*;
import
javax.microedition.lcdui.*;
/**
* @author Taqienz
*/
public
class Midlet extends MIDlet {
Game x;
MenuUtama mu;
Instruksi i;
Tentang t;
Display d = Display.getDisplay(this);
public Midlet() {
mainMenu();
}
public void startApp() {
}
public void pauseApp() {
}
public void destroyApp(boolean
unconditional) {
}
public void kosongkan() {
if(x != null){
x.stop();
x = null;
}
if(i != null){
i.stop();
i = null;
}
if(mu != null){
mu.stop();
mu = null;
}
if(t != null){
t.stop();
t = null;
}
}
public void mainMenu(){
kosongkan();
mu = new MenuUtama(this);
mu.start();
d.setCurrent(mu);
}
public void mainkan(){
kosongkan();
x = new Game(this);
x.start();
d.setCurrent(x);
}
public void instruksi(){
kosongkan();
i = new Instruksi(this);
i.start();
d.setCurrent(i);
}
public void quit() {
destroyApp(true);
notifyDestroyed();
}
void tentang() {
kosongkan();
t = new Tentang(this);
t.start();
d.setCurrent(t);
}
}
3.Kemudian kita buat java class baru,
kita ikuti langkah berikut.
Lalu ketikan koding berikut:
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
import
javax.microedition.media.*;
import
javax.microedition.media.control.*;
import
java.io.*;
import
java.util.Random;
import
javax.microedition.lcdui.*;
import
javax.microedition.lcdui.game.*;
/**
*
* @author Taqienz
*/
class
Game extends GameCanvas implements Runnable, PlayerListener{
private static Player musik;
private boolean running;
private Sprite user;
private Sprite enemy;
private Sprite kastil;
private Sprite target;
private Sprite ammo;
private Sprite rumput;
private final Midlet midlet;
private final PlayerAttrib player;
private boolean allowUp;
private boolean allowDown;
private boolean allowLeft;
private boolean allowRight;
private PlayerAttrib[] musuh = new
PlayerAttrib[] {};
private ObjectAttrib[] amunisi = new
ObjectAttrib[] {};
private int musuhKeluar = 100;
private int[] HPKastil = new int[] {100,
100};
private int delaynya = 0;
private boolean gameOver = false;
private boolean menang = false;
private int musuhTertembak = 0;
private VolumeControl vc;
public Game(Midlet midlet) {
super(true);
this.midlet = midlet;
player = new PlayerAttrib(100);
try {
user = new
Sprite(Image.createImage("/gambar/khe.png"), 32, 32);
enemy = new
Sprite(Image.createImage("/gambar/hantu.png"), 32, 32);
target = new
Sprite(Image.createImage("/gambar/aoa.png"));
kastil = new
Sprite(Image.createImage("/gambar/dijaga.png"));
rumput = new
Sprite(Image.createImage("/gambar/rumput.png"));
ammo = new
Sprite(Image.createImage("/gambar/amunisi.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
target.setPosition(getWidth() / 2 - target.getWidth()
/ 2,
getHeight() / 2 - 16);
kastil.setPosition(getWidth() / 2 -
kastil.getWidth() / 2,
getHeight() / 2 -
kastil.getHeight() / 2);
setFullScreenMode(true);
}
public void start(){
running = true;
Thread x = new Thread(this);
x.start();
try{
playMedia("/suara/suara.mid","midi",-1);
}catch(Exception e){}
}
public void stop(){
running = false;
}
public void run() {
Graphics g = getGraphics();
while(running){
try {
getInput();
if(!gameOver){
updateGame();
drawScreen(g);
} else {
g.setColor(0x000000);
g.fillRect(0, 0,
getWidth(), getHeight());
if(menang){
g.setColor(0xFFFFFF);
g.drawString("ANDA
BERHASIL!", getWidth() / 2,
getHeight() /
2, Graphics.BOTTOM | Graphics.HCENTER);
} else {
g.setColor(0xFFFFFF);
g.drawString("ANDA
GAGAL", getWidth() / 2,
getHeight() / 2, Graphics.BOTTOM |
Graphics.HCENTER);
}
g.setColor(0xFFFFFF);
g.drawString("Silahkan
Kembali Ke Menu Utama", getWidth() / 2,
getHeight() / 2 +
4, Graphics.TOP | Graphics.HCENTER);
}
flushGraphics();
Thread.sleep(60);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
private void drawScreen(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(),
getHeight());
user.setPosition(player.getX(),
player.getY());
user.setFrame(player.getFrame());
rumput.paint(g);
target.paint(g);
for(int i = 0; i < musuh.length; i++){
enemy.setPosition(musuh[i].getX(),
musuh[i].getY());
enemy.setFrame(musuh[i].getFrame());
enemy.paint(g);
}
user.paint(g);
kastil.paint(g);
for(int i = 0; i < amunisi.length;
i++){
ammo.setPosition(amunisi[i].getX(),
amunisi[i].getY());
ammo.paint(g);
}
drawHUD(g);
}
private void getInput() {
int keyState = getKeyStates();
if(allowUp && (keyState &
UP_PRESSED) != 0){
player.setFacing(PlayerAttrib.FACING_ATAS);
player.setY(player.getY() - 5);
} else if(allowDown &&
(keyState & DOWN_PRESSED) != 0){
player.setFacing(PlayerAttrib.FACING_BAWAH);
player.setY(player.getY() + 5);
}
if(allowLeft && (keyState &
LEFT_PRESSED) != 0){
player.setFacing(PlayerAttrib.FACING_KIRI);
player.setX(player.getX() - 5);
} else if(allowRight &&
(keyState & RIGHT_PRESSED) != 0){
player.setFacing(PlayerAttrib.FACING_KANAN);
player.setX(player.getX() + 5);
}
if((keyState & FIRE_PRESSED) != 0){
if(gameOver){
midlet.mainMenu();
} else {
if(delaynya <= 0){
tambahAmunisi(player.getFacing());
delaynya = 1;
}
}
}
}
private void updateGame() {
if(delaynya >= 0)
delaynya--;
player.nextFrame();
allowDown = true;
allowLeft = true;
allowRight = true;
allowUp = true;
if(user.collidesWith(target, false)){
if(user.getX() < target.getX()){
allowRight = false;
}
if(user.getX() + user.getWidth()
> target.getX() +
target.getWidth()){
allowLeft = false;
}
if(user.getY() < target.getY()){
allowDown = false;
}
if(user.getY() + user.getWidth()
>
target.getY() +
target.getHeight()){
allowUp = false;
}
}
musuhKeluar--;
if(musuhKeluar <= 0){
musuhKeluar = 75;
tambahMusuh();
}
for(int i = 0; i < musuh.length;
i++){
musuh[i].setY(musuh[i].getY() +
musuh[i].getCustom(0));
musuh[i].nextFrame();
enemy.setFrame(musuh[i].getFrame());
enemy.setPosition(musuh[i].getX(),
musuh[i].getY());
boolean dead = false;
if(enemy.collidesWith(target,
true)){
deleteMusuh(i);
HPKastil[0] -= 20;
dead = true;
}
if(!dead && enemy.getY()
> getHeight() + 10 &&
enemy.getY() +
enemy.getHeight() < -10){
deleteMusuh(i);
dead = true;
}
}
for(int i = 0; i < amunisi.length;
i++){
int xSpeed = 0;
int ySpeed = 0;
if(amunisi[i].getCustom(0) ==
PlayerAttrib.FACING_ATAS){
ySpeed =
-amunisi[i].getCustom(1);
} else if(amunisi[i].getCustom(0)
== PlayerAttrib.FACING_BAWAH){
ySpeed =
amunisi[i].getCustom(1);
} else if(amunisi[i].getCustom(0)
== PlayerAttrib.FACING_KIRI){
xSpeed =
-amunisi[i].getCustom(1);
} else if(amunisi[i].getCustom(0)
== PlayerAttrib.FACING_KANAN){
xSpeed =
amunisi[i].getCustom(1);
}
amunisi[i].setX(amunisi[i].getX() +
xSpeed);
amunisi[i].setY(amunisi[i].getY() +
ySpeed);
amunisi[i].updateCustom(2,
amunisi[i].getCustom(2) +
amunisi[i].getCustom(1));
boolean terhapus = false;
if(amunisi[i].getCustom(2) >
amunisi[i].getCustom(3)){
deleteAmunisi(i);
terhapus = true;
}
if(!terhapus){
ammo.setPosition(amunisi[i].getX(),
amunisi[i].getY());
for(int x = 0; x <
musuh.length; x++){
enemy.setPosition(musuh[x].getX(), musuh[x].getY());
if(ammo.collidesWith(enemy,
true)){
terhapus = true;
deleteMusuh(x);
deleteAmunisi(i);
musuhTertembak++;
break;
}
}
}
}
if(HPKastil[0] <= 0){
gameOver = true;
menang = false;
}
if(musuhTertembak >= 2){
gameOver = true;
menang = true;
}
}
private void tambahMusuh(){
PlayerAttrib[] musuhTmp = musuh;
Random r = new Random();
musuh = new
PlayerAttrib[musuhTmp.length + 1];
for(int i = 0; i < musuhTmp.length;
i++){
musuh[i] = musuhTmp[i];
}
PlayerAttrib musuhBaru = new
PlayerAttrib(75);
musuhBaru.setY(getHeight() + 20);
musuhBaru.setCustom(new int[] {-2 + (-1
* r.nextInt(2))});
musuhBaru.setFacing(PlayerAttrib.FACING_ATAS);
if(r.nextInt(2) == 1){
musuhBaru.setY(-enemy.getHeight()-20);
musuhBaru.setCustom(new int[] {2 +
(1 * r.nextInt(2))});
musuhBaru.setFacing(PlayerAttrib.FACING_BAWAH);
}
musuhBaru.setX(20 +
r.nextInt(getWidth() - 40 - enemy.getWidth()));
musuh[musuhTmp.length] = musuhBaru;
}
private void deleteMusuh(int i) {
if(musuhAda(i)){
PlayerAttrib[] tmp = musuh;
musuh = new PlayerAttrib[tmp.length
- 1];
int ID = 0;
for(int x = 0; x < tmp.length;
x++){
if(x == i){
continue;
}
musuh[ID] = tmp[i];
ID++;
}
}
}
private boolean musuhAda(int i) {
if(i < musuh.length){
return true;
}
return false;
}
private void tambahAmunisi(int facing){
ObjectAttrib[] tmp = amunisi;
Random r = new Random();
amunisi = new ObjectAttrib[tmp.length +
1];
for(int i = 0; i < tmp.length; i++){
amunisi[i] = tmp[i];
}
ObjectAttrib amoBaru = new ObjectAttrib();
amoBaru.setX(player.getX() +
user.getWidth() / 2);
amoBaru.setY(player.getY() +
user.getHeight() / 2);
amoBaru.setCustom(new int[] {facing, 8,
0, 200});
amunisi[tmp.length] = amoBaru;
}
private void deleteAmunisi(int i) {
if(AmmoAda(i)){
ObjectAttrib[] tmp = amunisi;
amunisi = new
ObjectAttrib[tmp.length - 1];
int ID = 0;
for(int x = 0; x < tmp.length;
x++){
if(x == i){
continue;
}
amunisi[ID] = tmp[i];
ID++;
}
}
}
private boolean AmmoAda(int i) {
if(i < amunisi.length){
return true;
}
return false;
}
private void drawHUD(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, getHeight() - 30,
getWidth(), 30);
g.setColor(0x000000);
g.fillRect(0, getHeight() - 27,
getWidth(), 27);
g.setColor(0xFFFFFF);
g.drawString("HP:", 4,
getHeight() - 21, 0);
g.setColor(0xFF0000);
g.fillRect(35, getHeight() - 18,
getWidth() - 42, 10);
g.setColor(0x00FF00);
final int[] HPKastil1 = HPKastil;
int width = (getWidth() - 42) *
HPKastil1[0] / HPKastil1[1];
g.fillRect(35, getHeight() - 18, width,
10);
}
private void playMedia(String file, String
type, int loop) throws Exception {
musik =
Manager.createPlayer(getClass().getResourceAsStream(file), "audio/"+type);
musik.addPlayerListener(this);
musik.setLoopCount(loop);
musik.prefetch();
musik.realize();
vc =
(VolumeControl)musik.getControl("VolumeControl");
if (vc != null) {
vc.setLevel(100);
}
musik.start();
}
public void playerUpdate(Player player,
String event, Object eventData){ }
}
4.Kemudian buat class baruu dengan
nama menu utama,intruksi,music,ObjectAtrbb,playerAtrbb,tentang.
Kemudian isikan script
ddlmnya.Berikut ScriptNya:
-class Menu Utama:
import
java.io.IOException;
import
javax.microedition.lcdui.Canvas;
import
javax.microedition.lcdui.Graphics;
import
javax.microedition.lcdui.Image;
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
/**
*
* @author Taqienz
*/
public
class MenuUtama extends Canvas implements Runnable{
private int maxMenu = 4;
private int menu = 0;
private Image gambar;
private Image gambarKursor;
private boolean running;
private final Midlet midlet;
public MenuUtama(Midlet g) {
this.midlet = g;
try {
gambar =
Image.createImage("/gambar/mainMenu.png");
gambarKursor =
Image.createImage("/gambar/kursor.png");
} catch (IOException ex) {
ex.printStackTrace();
}
setFullScreenMode(true);
}
protected void paint(Graphics g) {
g.drawImage(gambar, 0, 0, 0);
g.drawImage(gambarKursor, getWidth() /
2, 145 + 35 * menu, Graphics.HCENTER |
Graphics.TOP);
}
public void run() {
while(running){
try {
repaint();
Thread.sleep(60);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public void start(){
running = true;
Thread t = new Thread(this);
t.start();
}
public void stop(){
running = false;
}
protected void keyPressed(int keyCode){
super.keyPressed(keyCode);
if(getGameAction(keyCode) == UP
&& menu > 0){
menu--;
}
if(getGameAction(keyCode) == DOWN
&& menu <= maxMenu - 2){
menu++;
}
if(getGameAction(keyCode) == FIRE){
switch(menu){
case 0:
midlet.mainkan();
break;
case 1:
midlet.instruksi();
break;
case 2:
midlet.tentang();
break;
case 3:
midlet.quit();
}
}
}
}
-class Instruksi:
import
java.io.IOException;
import
javax.microedition.lcdui.Canvas;
import
javax.microedition.lcdui.Graphics;
import
javax.microedition.lcdui.Image;
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
/**
*
* @author Taqienz
*/
public
class Instruksi extends Canvas implements Runnable{
private Image gambar;
private boolean running;
private final Midlet midlet;
public Instruksi(Midlet g) {
this.midlet = g;
try {
gambar =
Image.createImage("/gambar/instruksi.png");
} catch (IOException ex) {
ex.printStackTrace();
}
setFullScreenMode(true);
}
protected void paint(Graphics g) {
g.drawImage(gambar, 0, 0, 0);
}
public void run() {
while(running){
try {
repaint();
Thread.sleep(60);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public void start(){
running = true;
Thread t = new Thread(this);
t.start();
}
public void stop(){
running = false;
}
protected void keyPressed(int keyCode) {
if(getGameAction(keyCode) == FIRE){
midlet.mainMenu();
}
}
}
-class music:
import
javax.microedition.media.Manager;
import
javax.microedition.media.Player;
import
javax.microedition.media.Player;
import
javax.microedition.media.control.VolumeControl;
//
///*
//
* To change this template, choose Tools | Templates
//
* and open the template in the editor.
//
*/
//
///**
//
*
//
* @author Taqienz
*/
public
class Musik {
Player
Player;
VolumeControl
vc;
private static void start() {
throw new
UnsupportedOperationException("Not yet implemented");
}
public void Musik(String musicFile, int
loopCount){
try{
Player = Manager.createPlayer(getClass().getResourceAsStream,("/"+musicFile),"audio/midi");
Player.addPlayerListener(this);
Player.setLoopCount(loop);
Player.prefetch();
Player.realize();
vc =
(VolumeControl)Musik.getControl("VolumeControl");
if (vc != null) {
vc.setLevel(100);
}
Player.start();
}
}
-class ObjectAtrbb:
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
/**
*
* @author Taqienz
*/
public
class ObjectAttrib {
private int x, y;
private int[] custom;
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setCustom(int[] custom) {
this.custom = custom;
}
public int getCustom(int id) {
return custom[id];
}
public void updateCustom(int id, int val){
if(id >= 0 && id <
custom.length){
custom[id] = val;
}
}
}
-class PlayerAtribb:
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
/**
*
* @author Taqienz
*/
public
class PlayerAttrib extends ObjectAttrib{
public final static int FACING_BAWAH = 0;
public final static int FACING_KIRI = 1;
public final static int FACING_KANAN = 2;
public final static int FACING_ATAS = 3;
private int[][] frameSequences = {
{0, 1, 2, 1},
{3, 4, 5, 4},
{6, 7, 8, 7},
{9, 10, 11, 10},
};
private int facing;
private int frame;
private int HP;
private int maxHP;
public int getFacing() {
return facing;
}
public PlayerAttrib(int HP) {
this.HP = HP;
this.maxHP = HP;
}
public void setHP(int HP) {
this.HP = HP;
}
public int getHP() {
return HP;
}
public void damaged(int damage){
setHP(getHP() - damage);
}
public boolean isAlive(){
if(getHP() > 0){
return false;
}
return true;
}
public int getMaxHP() {
return maxHP;
}
public int getFrame() {
return frameSequences[facing][frame];
}
public void nextFrame(){
frame++;
if(frame >=
frameSequences[facing].length){
frame = 0;
}
}
public void setFacing(int facing) {
this.facing = facing;
}
}
-class tentang:
import
java.io.IOException;
import
javax.microedition.lcdui.Canvas;
import
javax.microedition.lcdui.Graphics;
import
javax.microedition.lcdui.Image;
/*
* To change this template, choose Tools |
Templates
* and open the template in the editor.
*/
/**
*
* @author Taqienz
*/
public
class Tentang extends Canvas implements Runnable{
private Image gambar;
private boolean running;
private final Midlet midlet;
public Tentang(Midlet g) {
this.midlet = g;
try {
gambar =
Image.createImage("/gambar/tentang.png");
} catch (IOException ex) {
ex.printStackTrace();
}
setFullScreenMode(true);
}
protected void paint(Graphics g) {
g.drawImage(gambar, 0, 0, 0);
}
public void run() {
while(running){
try {
repaint();
Thread.sleep(60);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public void start(){
running = true;
Thread t = new Thread(this);
t.start();
}
public void stop(){
running = false;
}
protected void keyPressed(int keyCode) {
if(getGameAction(keyCode) == FIRE){
midlet.mainMenu();
}
}
}
5.Setelah Semua
sudah Diisi script,kita buat Package Baru,lalu Copykan Gambar Yang Sudah
Disiapkan tadi di awal pembuatan:
Stelah
di copy hasilnya seperti ini:
6.Setelah itu kita juga menambahkan
suara didalam game tersebut,langkahnya sama buat package baru dengan nama
suara.
Coba di running Gamenya.Maka Hasilnya
sebagai berikut:
http://newgame9.com/final-fantasy-xiv-playstation-3/
BalasHapus