Skrip Game Pong Versi Java ME (Mobile Aplication)

Buat Class Baru, dengan nama Class : MainMidlet.java. Skripnya sebagai berikut :

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class MainMidlet extends MIDlet {
    public MainCanvas canvas;
   
   
    public MainMidlet() {
        canvas = new MainCanvas(this);
    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
        // TODO Auto-generated method stub

    }

    protected void pauseApp() {
        // TODO Auto-generated method stub

    }

    protected void startApp() throws MIDletStateChangeException {
        //System.out.println("Hello world!");
       
        Display display = Display.getDisplay(this);
        display.setCurrent(canvas);
        canvas.start();
    }

}

Kemudian, buat Class lagi dengan nama : MainCanvas.java. Skripnya adalah :

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.midlet.MIDlet;
/*
Pada bagian di atas berfungsi untuk meng-import class lainnya .
Sama dengan fungsi include pada php dan C++
Kelima class yang diimport di atas harus ada, saat akan membuat sebuah aplikasi Java ME.
*/

public class MainCanvas extends GameCanvas implements Runnable {
    //deklarasi class main, dan meng-extends class GameCanvas
   
    //Deklarasi Variabel yang diperlukan program
    public MIDlet mainMidlet;
    public Graphics g;
    public static int SLEEP_TIME = 1000/30;
    public static int NUMBER_OF_MENU=4;
   
    public int mainMenuState;
   
    private boolean upButtonHolded;
    private boolean downButtonHolded;
    private boolean fireButtonHolded;
   
    private Image mainMenuBackground;
    private int screenState;
    private static int MAIN_MENU_SCREEN = 0;
    private static int IN_GAME_SCREEN = 1;
    private static int CREDITS_SCREEN = 2;
    private static int GAME_OVER_SCREEN = 3;
   
    private int ballx;
    private int bally;
    private int BALL_X_SPEED = 1;
    private int BALL_Y_SPEED = 3;
   
    private int paddlex;
    private int paddley;
    private int PADDLE_WIDTH;
    private int PADDLE_HEIGHT;
   
    private int playerScore;
    private int highestcombo;
    private int combo;
    private int playerLife;
    //akhir dari deklarasi program
   
   
    //membuat mode full screen dalam HP
    protected MainCanvas(MIDlet midlet) {
        super(false);
        mainMidlet = midlet;
        this.setFullScreenMode(true);
    }
   
    //buat thread baru untuk menjalankan canvas
    public void start(){
        Thread runner = new Thread(this);
        runner.start();
    }

   
    //disinilah kita menuliskan kode programnya, namun di sini lebih singkat
    //dikarenakan menggunakan fungsi-fungsi, yang telah dideklarasikan di bawah
    public void run() {
        //panggil fungsi initialize() ==> untuk memberi nilai awal variabel, memberi gambar background
        initialize();
       
       
        /*statemen perulangan untuk mengupdate layar
              nantinya gambar obyek bergerak berasal dari obyek satu-satu
            kemudian dengan adanya perulangan ini posisi obyek (koordinat x,y)
            ditambahkan dalam perulangan
        */
        while(true){
           
            /*Memeriksa variabel screenState, untuk meng-handle menu mana yang akan ditampilkan
            */
            if(screenState==MAIN_MENU_SCREEN){
                //tampilkan main menu
                inputMenu();
                drawMenu();
            }else if(screenState==IN_GAME_SCREEN){
                //tampilkan menu game
                inputGame();
                updateGame();
                drawInGame();
            }else if(screenState==CREDITS_SCREEN){
                //tampilkan menu credits (pembuat game)
                inputCredits();
                drawCredits();
            }else if(screenState==GAME_OVER_SCREEN){
                //jika game over
                inputGameOver();
                drawGameOver();
            }
           
           
            //panggil flushgraphics untuk mengupdate gambar dengan yang paling baru
            //inti utama dari "membuat gambar bergerak" ada di metode flushGraphics() ini
            //yang berfungsi untuk mengupdate posisi gambar
            flushGraphics();
           
           
            try {
                //panggil fungsi sleep agar update tidak memberatkan device mobile
                Thread.sleep(SLEEP_TIME);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
   
    //inisialisasi variabel, dan memberikan nilai awal variabel
    public void initialize(){
        BALL_X_SPEED = 1; //penambahan 1 pixel ke arah horizontal
        BALL_Y_SPEED = 3; //penambahan 3 pixel ke arah vertikal
        bally=50;    // posisi  bola awal di titik 50 pixel pada sumbu x
        ballx=50;    // posisi  bola awal di titik 50 pixel pada sumbu y
        paddlex = 100; //posisi awal paddle di titik 100 pixel (horizontal)
        paddley = 290; //posisi awal paddle di titik 290 pixel (vertikal)
        PADDLE_WIDTH=40; // panjang paddle 40px
        PADDLE_HEIGHT=20; //lebar paddle 20 px
        playerScore=0; // nilai awal skor
        highestcombo=0; // nilai awal combo
        combo=0; //combo
        playerLife=3; //"nyawa" pemain, diberi 3
       
        g = getGraphics(); //inisialisasi variabel g, agar bisa membuat grafik/gambar
       
        mainMenuState=0;
        screenState=0; //memberi nilai awal status menu ==> 0 berarti menampilkan daftar menu
       
        //load file menjadi objek image; HARUS ada di dalam blok try-catch
        try {
            mainMenuBackground = Image.createImage("/background.png");
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
   
    //mengatur gerakan bola
    public void updateGame(){
       
        //mengatur gerakan bola, jika memantul dinding samping kanan dan kiri, dinding di sini
        //adalah lebar dari layar HP (diketahui dengan fungsi getWidth();
        ballx+=BALL_X_SPEED;
        if(ballx>getWidth()){
            BALL_X_SPEED*=-1;//jika posisi x bola lebih dari lebar layar, maka ballspeed dikalikan -1
        }else if(ballx<0){
            BALL_X_SPEED*=-1;
        }
       
        //mengatur gerakan bola, jika memantul dinding sebelah atas,
        //adalah tinggi dari layar HP (diketahui dengan fungsi getheight();
        bally+=BALL_Y_SPEED;
        if(bally>getHeight()){
            //BALL_Y_SPEED*=-1;
            goal();
        }else if(bally<0){
            BALL_Y_SPEED*=-1;
        }
       
       
        //metode untuk meng-update posisi bola jika "menabrak" paddle
        if(isInsideRectangle(ballx, bally, paddlex, paddley, PADDLE_WIDTH, PADDLE_HEIGHT)){
            BALL_Y_SPEED= Math.abs(BALL_Y_SPEED) * -1;
            BALL_X_SPEED+=1;
            BALL_Y_SPEED-=1;
            playerScore++; //menambah skor jika berhasil menahan bola
            combo++; // combo juga ditambah
           
            if(combo>highestcombo) // cek skor combo tertinggi
                highestcombo=combo;
        }
    }
   
    //method untuk menggambar MENU UTAMA
    public void drawMenu(){
        //tampilkan background. (objek image, posisi x, posisi y, alignment)
        g.drawImage(mainMenuBackground, 0, 0, 0);
        //tulis judul game
        drawText("SPACE IN VADER", 50, 50, 0xffff00);
        //tampilkan menu
        if(mainMenuState==0) drawMenuItem("PLAY", 100, 150, 100, 25, 0x00ff00, true);
        else drawMenuItem("PLAY", 100, 150, 100, 25, 0x00ff00, false);
        if(mainMenuState==1) drawMenuItem("TUTORIAL",100, 180, 100, 25, 0x00ff00, true);
        else drawMenuItem("TUTORIAL",100, 180, 100, 25, 0x00ff00, false);
        if(mainMenuState==2) drawMenuItem("ABOUT", 100, 210, 100, 25, 0x00ff00, true);
        else drawMenuItem("ABOUT", 100, 210, 100, 25, 0x00ff00, false);
        if(mainMenuState==3) drawMenuItem("EXIT", 100, 240, 100, 25, 0x00ff00, true);
        else drawMenuItem("EXIT", 100, 240, 100, 25, 0x00ff00, false);
    }
    public void drawInGame(){
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(), getHeight());
        drawText("Score: " + playerScore, 10, 10, 0xffffff);
        drawText("Combo: " + highestcombo, 10, 30, 0xffffff);
        drawText("Press FIRE to go back", 50, 250, 0xffffff);

        drawCircle(ballx, bally, 10, 0x00ffff);
       
        drawPaddle(paddlex, paddley, PADDLE_WIDTH, PADDLE_HEIGHT);
       
    }
    public void drawCredits(){
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(), getHeight());
        drawText("This game is created", 50, 50, 0x00ff00);
        drawText("in Mobile Game Workshop", 50, 100, 0x00ff00);
       
        drawText("Press FIRE to go back", 50, 250, 0xffffff);
    }
    public void drawGameOver(){
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(), getHeight());
        drawText("GAME OVER", 50, 50, 0xff0000);
       
        drawText("Press FIRE to go back", 50, 250, 0xffffff);
    }
    public void drawCircle(int x, int y, int diameter, int color){
        g.setColor(color);
        g.fillArc(x-diameter/2, y-diameter/2, diameter, diameter, 0, 360);
    }
    public void drawText(String text, int x, int y, int color){
        g.setColor(color);
        g.drawString(text, x, y, 0);
    }
    public void drawMenuItem(String text, int x, int y, int width, int height, int color, boolean selected){
        drawText(text, x, y, color);
        if(selected){
            g.setColor(color);
            g.drawRect(x, y, width, height);
        }
       
    }
    public void drawPaddle(int x, int y, int width, int height){
        g.setColor(0xffffff);
        g.fillRect(x, y, width, height);
    }
    private void previousMenu(){
        mainMenuState-=1;
        if(mainMenuState<0){
            mainMenuState=NUMBER_OF_MENU-1;
        }
    }
    private void nextMenu(){
        mainMenuState+=1;
        if(mainMenuState>=NUMBER_OF_MENU){
            mainMenuState=0;
        }
    }
    private void changeScreen(int screenCode){
        screenState = screenCode;
    }
   
    private boolean isInsideRectangle(int px, int py, int x, int y, int width, int height){
        if(    (px>x) &&
            (px<=(x+width)) &&
            (py>y) &&
            (py<=y+height))
            return true;
        else
            return false;
    }

    private void inputMenu(){
        int keyState = getKeyStates();
       
        if((keyState & UP_PRESSED) !=0){
            //System.out.println("UP pressed ");
            if(!upButtonHolded){
                previousMenu();
                upButtonHolded=true;
            }
        }else if((keyState & DOWN_PRESSED) !=0){
            //System.out.println("DOWN pressed ");
            if(!downButtonHolded){
                nextMenu();
                downButtonHolded=true;
            }
        }else if((keyState & RIGHT_PRESSED) !=0){
            //System.out.println("RIGHT pressed ");
        }else if((keyState & LEFT_PRESSED) !=0){
            //System.out.println("LEFT pressed ");
        }else if((keyState & FIRE_PRESSED) !=0){
            //System.out.println("FIRE pressed");
            //System.err.println("Menu " + mainMenuState + " chosen.");
            if(!fireButtonHolded){
                if(mainMenuState==0){
                    changeScreen(IN_GAME_SCREEN);
                    resetGame();
                }else if(mainMenuState==1){
                    //tutorial
                }else if(mainMenuState==2){
                    changeScreen(CREDITS_SCREEN);
                }else if(mainMenuState==3){
                    //exit
                }
                fireButtonHolded=true;
            }
        }else{
            if(upButtonHolded)
                upButtonHolded=false;
            if(downButtonHolded)
                downButtonHolded=false;
            if(fireButtonHolded)
                fireButtonHolded=false;
        }
    }
    private void inputGame(){
        int keyState = getKeyStates();
       
        if((keyState & UP_PRESSED) !=0){
           
        }else if((keyState & DOWN_PRESSED) !=0){
           
        }else if((keyState & RIGHT_PRESSED) !=0){
            paddlex+=3;
        }else if((keyState & LEFT_PRESSED) !=0){
            paddlex-=3;
        }else if((keyState & FIRE_PRESSED) !=0){
            if(!fireButtonHolded){
                changeScreen(MAIN_MENU_SCREEN);
                fireButtonHolded=true;
            }
        }else{
            /*if(upButtonHolded)
                upButtonHolded=false;
            if(downButtonHolded)
                downButtonHolded=false;*/
            if(fireButtonHolded)
                fireButtonHolded=false;
        }
    }
    private void inputCredits(){
        int keyState = getKeyStates();
       
        if((keyState & FIRE_PRESSED) !=0){
            if(!fireButtonHolded){
                changeScreen(MAIN_MENU_SCREEN);
                fireButtonHolded=true;
            }
        }else{
            if(fireButtonHolded)
                fireButtonHolded=false;
        }
    }
    private void goal(){
        combo=0;
        BALL_X_SPEED=1;
        BALL_Y_SPEED=3;
        ballx=50;
        bally=50;
        playerLife--;
        if(playerLife<=0)
            changeScreen(GAME_OVER_SCREEN);
    }
    private void resetGame(){
        BALL_X_SPEED=1;
        BALL_Y_SPEED=3;
        ballx=50;
        bally=50;
        playerScore=0;
        highestcombo=0;
        combo=0;
        playerLife=3;
    }
    private void inputGameOver(){
        int keyState = getKeyStates();
       
        if((keyState & FIRE_PRESSED) !=0){
            if(!fireButtonHolded){
                changeScreen(MAIN_MENU_SCREEN);
                fireButtonHolded=true;
            }
        }else{
            if(fireButtonHolded)
                fireButtonHolded=false;
        }
    }
}
Terakhir, jalankan (Run) sebagai Java MIDlet, dan selesai.

Comments

Popular posts from this blog

Download Aplikasi Ujian Online dengan Codeigniter, Ajax, JSON

Langkah-langkah install aplikasi ujian online berbasis web

Cara setting aplikasi ujian online di jaringan untuk banyak komputer client