Jumat, 18 Januari 2013

TUTORIAL PEMBUATAN GAME J2ME


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: