Thứ Tư, 1 tháng 8, 2012

Basic Java ME Game Template Part 2

Bản quyền Devlin's lab.
Đến phần: 1 | 2 


Trong phần này, chúng ta sẽ tạo lớp MIDlet để chạy game. Bạn nên bắt đầu với Part 1 trước nếu chưa xem. Bây giờ, hãy mở source code của MIDlet ra. Ta sẽ khai báo vài biến dưới dòng khai báo lớp.

public class midMain extends MIDlet {
    private clsCanvas myCanvas;
    public boolean isPaused = false;
    ...
    ...

biến myCanvas được khai báo với kiểu giá trị clsCanvas, là lớp ta vừa viết. Biến isPaused sẽ cho chúng ta biết MIDlet có đang tạm dừng hay không. Tiếp theo, chúng ta thêm vài dòng code vào hàm startApp( ) để bắt đầu vòng lặp game và hiện thực lớp clsCanvas.

    public void startApp() {
        // check if MIDlet was paused
        if (!isPaused){
            // initialized only once
            // create an instance of clsCanvas
            myCanvas = new clsCanvas(this);
            // get display
            Display d = Display.getDisplay(this);
            // make clsCanvas visible
            d.setCurrent(myCanvas);
            // launch the thread/start main loop
            myCanvas.start();
        }
        //no longer paused
        isPaused = false;
    }


Đối tượng Display chịu trách nhiệm hiển thị mọi thứ lên màn hình. Trong code dưới đây, Display sẽ liên kết với MIDlet và đặt đối tượng clsCanvas là đối tượng hiện tại được hiển thị trên thiết bị. Chúng ta cũng gọi phương thức start( ) của clsCanvas để bắt đầu thread ( luồng ) và khởi động vòng lặp.

Tiếp theo, chúng ta sửa phương thức pause( ) để biến isPause được cập nhật mỗi khi MIDlet mất kiểm soát hay được ẩn đi.

    public void pauseApp() {
        // MIDlet is paused or not the active window
        isPaused = true;
    }


Cuối cùng ta thêm code để giải phóng tài nguyên MIDlet đã chiếm dụng khi game kết thúc. Code này được thêm vào phương thức destroyApp( )

        public void destroyApp(boolean unconditional) {
        myCanvas = null;
        // close MIDlet
        notifyDestroyed();
    }


Dưới đây là source code của lớp midMain.java

package pkgGame;

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.*;

public class midMain extends MIDlet {
    private clsCanvas myCanvas;
    public boolean isPaused = false;

    public void startApp() {
        // check if MIDlet was paused
        if (!isPaused){
            // initialized only once
            // create an instance of clsCanvas
            myCanvas = new clsCanvas(this);
            // get display
            Display d = Display.getDisplay(this);
            // make clsCanvas visible
            d.setCurrent(myCanvas);
            // launch the thread/start main loop
            myCanvas.start();
        }
        //no longer paused
        isPaused = false;
    }

    public void pauseApp() {
        // MIDlet is paused or not the active window
        isPaused = true;
    }

    public void destroyApp(boolean unconditional) {
        myCanvas = null;
        // close MIDlet
        notifyDestroyed();
    }
}

Còn đây là code hoàn chỉnh của lớp clsCanvas

package pkgGame;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class clsCanvas extends GameCanvas implements Runnable {
    private boolean isRunning = true;
    private Graphics g;
    private midMain p;
    
    public clsCanvas(midMain parent) {
        super(false);
        p = parent;
    }

    public void start(){
        // creat a new instance of the Thread class
        Thread thread = new Thread(this);
        // launch the thread
        thread.start();
    }

    public void run() {
        g = getGraphics();
        while(isRunning){
            // get key state
            int iKey = getKeyStates();
            // check if FIRE or 5 is pressed
            if ((iKey & FIRE_PRESSED) != 0){
                // signal an exit
                isRunning = false;
            }

            //set drawing color to black
            g.setColor(0x000000);
            //fill the whole screen with black
            g.fillRect(0, 0, getWidth(), getHeight());
            // set drawing color to white
            g.setColor(0xffffff);
            //display a string
            g.drawString("Basic Java ME Game Template", 2, 2, Graphics.TOP | Graphics.LEFT);
            //display the key states in white
            g.drawString(Integer.toString(iKey), 2, 22, Graphics.TOP | Graphics.LEFT);

            flushGraphics();

            try{
                // make this thread sleep for 30 ms
                Thread.sleep(30);
            } catch(Exception e){

            }
        }
        // mark as garbage
        g = null;
        // close the MIDlet
        p.destroyApp(true);
        p = null;
    }

}

Ok, chúng ta đã xong mẫu game đầu tiên. Bạn có thể thử ngay để xem những gì mình vừa làm được:

Emulator output : Basic Java ME Game Template

Bạn có thể download code ở đây : myGame.rar (26.4 Kb) 

Bài học hom nay đến đây là kết thúc. Tôi sẽ dùng mẫu này cho những phần sau của bài học. Nếu bạn có thắc mắc, hãy mail cho tôi scorpion06.vs.knight@gmail.com hoặc liên hệ trực tiếp đến Devlin tại trang blog của anh ta: 
http://devlinslab.blogspot.com/

Chúc các bạn thành công !!

Không có nhận xét nào:

Đăng nhận xét