Tutorial Pong Game di Blackberry

Pong

Penulis oleh Krishna.W

Sudah cukup lama vakum dan tidak menulis artikel, kali ini StudioIndependent memberikan sedikit tutorial.
Kali ini tutorial untuk BlackBerry.
nah buat kamu kamu yang ingin coba bikin game di blackberry,mungkin tutorial ini berguna buat kamu.

Ok langsung aja diliat tutorialnya.

Disini tidak akan dibahas basic dari blackberry seperti set up sdk dan lain – lain. untuk yang mau tau cara setup sdk blackberry silahkan dicari melalui om google.😀

Okeh.. qta langsung aja terjun ke coding.
Pertama-tama qta buat dua class utama yaitu MainApp dan Game Screen.

MainApp.java

package src;

import net.rim.device.api.ui.UiApplication;

/**
* The main class of application
* Based on Blackberry Game Programming Tutorial I: Basics by BhimZ
*/
class MainApp extends UiApplication {

    MainApp() {
        pushScreen(new GameScreen());
    }

    // Main method
    public static void main(String[] args) {
        MainApp app = new MainApp();
        app.enterEventDispatcher();
    }
}

GameScreen.java

package src;

import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.container.MainScreen;

/**
 * Screen class for drawing in game
 * Based on Blackberry Game Programming Tutorial I: Basics by BhimZ
 */
 class GameScreen extends MainScreen {
     private GameThread gameThread;

     // For device width and height
     private int devWidth, devHeight;

     // For ball position
     private int ballX, ballY;

     // For ball direction; -1 is left/up, 1 is right/down
     private int xDir, yDir;

     // For movement speed
     private int speed;

     GameScreen() {
        speed = 5;

        devWidth = Display.getWidth();
        devHeight = Display.getHeight();

        // Positioning ball on the middle of screen
        ballX = devWidth / 2;
        ballY = devHeight / 2;
        xDir = 1;
        yDir = 1;

        gameThread = new GameThread();

     }

     // Override the screen's paint method for drawing the ball
     protected void paint(Graphics g) {
         // Drawing the game background
         g.setColor(0xffffff);
         g.fillRect(0, 0, devWidth, devHeight);

         // Draw Pong ball
         g.setColor(0x000000);
         g.fillEllipse(ballX, ballY, ballX + 10, ballY, ballX, ballY + 10, 0, 360);
    }

    // Move the ball around. This method is called by GameThread
    protected void moveBall(int xd, int yd) {
        ballX += (speed * xd);
        ballY += (speed * yd);
    }

    protected void checkBallCollision() {
        int tmpX = ballX + (speed + 10) * xDir;
        int tmpY = ballY + (speed + 10) * yDir;

        // Check for floor and ceiling
        if(tmpY > devHeight) {
            yDir = -1;
        } else if(tmpY devWidth) {
            xDir = -1;
        } else if(tmpX < 0) {
            xDir = 1;
        }
    }

/*
 * Override the onClose method, which will be called when screen is closed.
 * Here we will set the game thread to stop.
 */
    public boolean onClose() {
        gameThread.running = false;
        return super.onClose();
    }

/**
 * The game thread class. Just a simple thread class which calls a method
 * every few milliseconds.
 *
 * @author BhimZ
 *
 */
    private class GameThread extends Thread {
        private boolean running = true;
        private long fps = 25; // The frame per second

        public GameThread() {
            start();
        }

        public void run() {
            long sleep = 1000 / fps;
            while(running) {
                checkBallCollision();
                moveBall(xDir, yDir);
                invalidate();
                try {
                    Thread.sleep(sleep);
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
     }
 }

Kelas MainApp adalah kelas utama,dimana nanti kelas ini lah yang akan dijalankan.
sedangkan kelas GameScreen, adalah kelas game,dimana segala sesuatu dari game logic akan ditulis disni,selain itu GameScreen memiliki InnerClass GameThread yang merupakan turunan dari kelas Thread.

Setelah itu,kita akan membuat paddle pong.

Pertama, qta buat beberapa variable yg akan digunakan untuk menyimpan nilai posisi dan arah dari paddle tersebut:


// For enemy's paddle position
 private int enemyX, enemyY;

// For enemy's paddle direction
 private int yEnemyDir;

Kemudian kita tambahkan logic untuk menggambar paddle tersebut di dalam method paint. kita akan menggunakan method fillRect untuk menggambarkan paddle-nya.


// Override the screen's paint method for drawing the ball
 protected void paint(Graphics g) {

     // Drawing the game background
     g.setColor(0xffffff);
     g.fillRect(0, 0, devWidth, devHeight);

     // Draw Pong ball
     g.setColor(0x000000);
     g.fillEllipse(ballX, ballY, ballX + 10, ballY, ballX, ballY + 10, 0, 360);

     // Added Code
     // Draw enemy's paddle
     g.setColor(0xff0000);
     g.fillRect(enemyX, enemyY, 15, 80);

}

Setelah itu, kita buat method baru untuk menggerakkan paddle.


protected void moveEnemyPaddle() {
    int tmpEnemyY = enemyY + (speed + 10) * yEnemyDir;

    if(tmpEnemyY > devHeight - 40) {
        yEnemyDir = -1;
    } else if(tmpEnemyY < 0) {<code>
        yEnemyDir = 1;
    }

    enemyY += (speed * yEnemyDir);
 }

Dan kita panggil method moveEnemyPaddle tersebut di method run agar terupdate.


public void run() {
    long sleep = 1000 / fps;
    while(running) {
        checkBallCollision();
        moveBall(xDir, yDir);
        moveEnemyPaddle(); //Added
        invalidate();
        try {
            Thread.sleep(sleep);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
     }
 }

Setelah kita membuat paddle Pong, sekarang akan kita tambahkan logic untuk collision detection antara paddle dengan bola Pong.

Logic untuk collision detection ini gw buat sederhana, pertama kita cek apakah posisi X dari bola melebihi posisi X dari paddle. Apabila iya, kemudian kita cek apakah posisi Y bola lebih besar dari posisi Y paddle dan lebih kecil daripada panjang paddle tersebut. Apabila kondisi ini terpenuhi, maka kita ubah arah bola.


// Check for collision with enemy's paddle
 if(tmpX > enemyX) {
     if((tmpY > enemyY) && (tmpY < enemyY + 80)) {
         xDir = -1;
     }
 }

Kemudian kita masukkan logic ini ke dalam method checkBallCollision:


protected void checkBallCollision() {
    int tmpX = ballX + (speed + 10) * xDir;
    int tmpY = ballY + (speed + 10) * yDir;

    // Check for floor and ceiling
    if(tmpY > devHeight) {
         yDir = -1;
    } else if(tmpY devWidth) {
        xDir = -1;
    } else if(tmpX enemyX) {
        if((tmpY > enemyY) && (tmpY < enemyY + 80)) {
            xDir = -1;
        }
    }
 }

kita akan melanjutkan dengan membuat paddle yang bisa dikontrol oleh player. Pertama qta tambahkan variabel2 yang dibutuhkan, antara lain:


// For player's paddle position
 private int playerX, playerY;

// For player's paddle direction;
 private int yPlayerDir;

kemudian qta set nilainya di konstruktor GameScreen:

GameScreen() {
    speed = 5;

    devWidth = Display.getWidth();
    devHeight = Display.getHeight();

    // Positioning ball on the middle of screen
    ballX = devWidth / 2;
    ballY = devHeight / 2;
    xDir = 1;
    yDir = 1;

    // Positioning enemy's paddle
    enemyX = devWidth - 30;
    enemyY = devHeight / 2;
    yEnemyDir = 1;

    // Added
    // Positioning player's paddle
    playerX = 30;
    playerY = devHeight / 2;
    yPlayerDir = -1;

    gameThread = new GameThread();

}

Lalu, sama seperti ketika membuat paddle musuh, qta gambar paddle untuk player dengan menggunakan method fillRect pada method paint.


// Override the screen's paint method for drawing the ball
protected void paint(Graphics g) {
    // Drawing the game background
    g.setColor(0xffffff);
    g.fillRect(0, 0, devWidth, devHeight);

    // Draw Pong ball
   g.setColor(0x000000);
   g.fillEllipse(ballX, ballY, ballX + 10, ballY, ballX, ballY + 10, 0, 360);

   // Draw enemy's paddle
   g.setColor(0xff0000);
   g.fillRect(enemyX, enemyY, 15, 80);

   // Added
   // Draw player's paddle
   g.setColor(0x0000ff);
   g.fillRect(playerX, playerY, 15, 80);
 }

Setelah itu qta tambahkan method untuk menggerakkan paddle dan untuk collision detection paddle dengan bola Pong.

Method untuk menggerakkan paddle player ini mirip dengan method untuk menggerakkan paddle musuh, tapi qta akan menambahkan parameter input untuk menentukan arah gerak paddle sesuai dengan input dari player. Kemudian qta tambahkan logic untuk collision detection antara paddle dengan batas2 layar game.


protected void movePlayerPaddle(int yd) {

    if(playerY > devHeight - 40) {
        yPlayerDir = -1;
    } else if(playerY < 0) {
        yPlayerDir = 1;
    }

    playerY += (speed * yd);
 }

Untuk kontrol, player akan menggunakan trackball/trackpad. Qta akan meng-override method navigationMovement untuk menentukan arah gerak paddle.


/*
 * Override method for capturing key event
 */
 public boolean navigationMovement(int dx, int dy, int time, int status) {
     if(dy 0) {
         yPlayerDir = 1;
     }
     return true;
 }

Apabila nilai dy negatif maka qta set nilai arah gerak paddle jadi -1, sehingga paddle bergerak ke atas. Jika nilai dy positif maka qta set arah gerak paddle jadi 1 sehingga paddle akan bergerak ke bawah.
Lalu qta panggil method movePlayerPaddle di method run


public void run() {
    long sleep = 1000 / fps;
        while(running) {
        checkBallCollision();
        moveBall(xDir, yDir);
        moveEnemyPaddle();
        movePlayerPaddle(yPlayerDir); //Added
        invalidate();
        try {
            Thread.sleep(sleep);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
     }
 }

Dan terakhir, qta tambahkan logic untuk collision detection antara paddle player dengan bola Pong di method checkBallCollision


protected void checkBallCollision() {
    int tmpX = ballX + (speed + 10) * xDir;
    int tmpY = ballY + (speed + 10) * yDir;

    // Check for floor and ceiling
    if(tmpY > devHeight) {
        yDir = -1;
    } else if(tmpY devWidth) {
        xDir = -1;
    } else if(tmpX enemyX) {
       if((tmpY > enemyY) && (tmpY < enemyY + 80)) {
           xDir = -1;
        }
    }

    // Added
    // Check for collision with player's paddle
    if(tmpX playerY) && (tmpY < playerY + 80)) {
        xDir = 1;
    }
   }
 }

Yups..

selesai sudah tutorial tentang pembuatan Game Pong sederhana di Blackberry.
Untuk modifikasi lebih lanjut, bisa ditambahkan logic untuk penghitungan skor. Dan agar lebih lengkap bisa ditambahkan User Interface untuk HUD dalam game dan layar untuk menu game.

Semoga tutorial sederhana ini bisa membantu para developers yang ingin bereksperimen membuat game untuk Blackberry.

Many thanks bwat oom Bhimz yg sudah memulai bikin tutorial tentang game development di Blackberry..

Comments are closed.