Please wait...

Top Bar -->

Bài 1 - Lập trình game đi cảnh Megaman trên Java

date_range 2017-02-27

Sau khi đọc qua bài mở đầu, mình hy vọng các bạn đã hiểu những gì chúng ta sẽ làm xong sau loạt bài này cũng như tạo cảm hứng cho việc học sắp tới. Còn bây giờ, chúng ta bắt đầu với bài đầu tiên nhé.

        Nói sơ qua về bài 1 này

Trong project của mình sẽ có 3 package là userniterface, gameobjects và effect. Tên của các package này mình đặt theo chức năng của các lớp nằm trong package đó. Trong bài một này chúng ta sẽ viết 3 lớp thuộc package userinterface về phần giao diện. Vì code của game rất nhiều nên mình sẽ dẫn ra một vài phần code trong game, các bạn chịu khó xem video để hiểu phần giải thích của mình nhé.  Cụ thể mình sẽ hướng dẫn các bạn tạo một cửa sổ để hiển thị được game lên desktop dùng JFrame thuộc bộ thư viện swing của java, sau đó là add một JPanel làm nhiệm vụ là khung vẽ lên JFrame để game của chúng ta vẽ trên đó, sau đó triển khai vòng lặp game và ví dụ hướng dẫn về một vài kiến thức trong phần Gameloop và giao diện

1. Tạo lớp GameFrame

public class GameFrame extends JFrame{

    public static final int SCREEN_WIDTH = 1000;
    public static final int SCREEN_HEIGHT = 600;

    public GameFrame(){

        super("Mega Man java game");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Toolkit toolkit = this.getToolkit();
        Dimension solution = toolkit.getScreenSize();

        this.setBounds((solution.width - SCREEN_WIDTH)/2, (solution.height - SCREEN_HEIGHT)/2, SCREEN_WIDTH, SCREEN_HEIGHT);

    }

    public void startGame(){

            gamePanel.startGame();
            this.setVisible(true);

    }

    public static void main(String arg[]){

            GameFrame gameFrame = new GameFrame();
            gameFrame.startGame();

    }

Video giải thích cho lớp GameFrame

2.Tạo lớp GamePanel

Đây là lớp có nhiệm vụ làm khung vẽ game đồng lớp cũng là một gameloop

public class GamePanel extends JPanel implements Runnable {

    private Thread thread;

    private boolean isRunning;

    @Override
    public void paint(Graphics g){

        g.setColor(Color.red);
        g.fillRect(0, 0, GameFrame.SCREEN_WIDTH, GameFrame.SCREEN_HEIGHT);

    }

    public void startGame(){
        if(thread == null){
            isRunning = true;
            thread = new Thread(this);
            thread.start();
        }
    }

    @Override
    public void run() {

        long FPS = 80;
        long period = 1000*1000000/FPS;
        long beginTime;
        long sleepTime;

        int a = 1;

        beginTime = System.nanoTime();
        while(isRunning){

            System.out.println("a = "+(a++));
            // Update
            // Render

            long deltaTime = System.nanoTime() - beginTime;
            sleepTime = period - deltaTime;

            try {
                if(sleepTime > 0)
                    Thread.sleep(sleepTime/1000000);
                else Thread.sleep(period/2000000);
            } catch (InterruptedException ex) {}

            beginTime = System.nanoTime();

        }

    }

}

Video hướng dẫn

3.Tạo lớp InputManager

public class InputManger {

    public void processKeyPressed(int keyCode){

        switch(keyCode){

            case KeyEvent.VK_UP:
                System.out.println("You press UP");
                break;

            case KeyEvent.VK_DOWN:
                System.out.println("You press DOWN");
                break;

            case KeyEvent.VK_LEFT:
                System.out.println("You press LEFT");
                break;
            case KeyEvent.VK_RIGHT:
                System.out.println("You press RIGHT");
                break;

            case KeyEvent.VK_ENTER:

                break;

            case KeyEvent.VK_SPACE:

                break;
            case KeyEvent.VK_A:

                break;

        }

    }

    public void processKeyReleased(int keyCode){

        switch(keyCode){

            case KeyEvent.VK_UP:
                System.out.println("You released UP");
                break;

            case KeyEvent.VK_DOWN:
                System.out.println("You released DOWN");
                break;

            case KeyEvent.VK_LEFT:
                System.out.println("You released LEFT");
                break;
            case KeyEvent.VK_RIGHT:
                System.out.println("You released RIGHT");
                break;

            case KeyEvent.VK_ENTER:

                break;

            case KeyEvent.VK_SPACE:

                break;
            case KeyEvent.VK_A:

                break;

        }

    }

}

Video hướng dẫn:

Bài 2 sẽ hướng dẫn làm các lớp về effect rất quan trọng cũng như khá khó, nếu bài mới chưa ra, các bạn có thể vào kênh youtube của mình để xem các video của loạt game này. Mình sẽ update và cập nhật bài mới nhất cũng như chỉnh sửa lại các bài đã đăng để chất lượng được tốt hơn. Chúc các bạn học tốt!