Lập trình Game2D trên Android bằng Java thuần (bài 2)


Bài 1

Phát triển Game về bản chất vẫn là làm phần mềm nên cũng gồm nhiều công đoạn khác nhau, đại khái qui trình làm Game gồm các khối công việc như sau:

game

Trong các loạt bài này chúng ta chỉ thực hiện  ở nhóm công việc 02 là chủ yếu, các giai đoạn còn lại đòi hỏi phải có thêm kiến thức vể hình ảnh, âm thanh, kịch bản, ….

Trong trò chơi chúng ta chia làm 02 nhóm tài nguyên là hình ảnh và âm thanh được lấy từ bài 01.

Để dễ hình dung chúng ta xem hình sau

game2

Giao diện để thể hiện trò chơi trên Android chúng ta sẽ sử dụng Activity đơn giản để sẽ nhé 😀 về xử lý chúng ta có 02 đối tượng

  1. Đối tượng chức các hình vẽ  (GamePanel)
  2. Đối tượng để xử lý các hình vẽ (Game)

Việc vẽ các đối tượng (30 lần trong 1 giây) và xử lý các đối tượng phải tiến hành song song nhau, ở đây tôi chọn GamePanel ở luồng chính và xử lý các đối tượng tôi sẽ tách chạy luồng riêng. Các thao tác này sẽ lặp đi lặp lại trong cả quá trình trò chơi diễn ra

Nói nhiều cũng rối giờ chúng ta tạo Project Android và 02 đối tượng GamePanel, Game như sau:

game4

Cấu trúc thư mục như trên

Chạy thử nhe

OK như vậy là chúng ta vừa tạo được vòng lặp cho trò chơi của mình.

Nội dung lớp Game

package vn.cusc.javagame2d;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;
import java.util.Timer;
import java.util.TimerTask;
/**
 * Created by ntdan on 2/7/17.
 */
public class Game extends Thread {
    public GamePanel gamePanel;
    public SurfaceHolder surfaceHolder;
    Timer timer;
    TimerTask task;

    boolean dangChay = true;
    int soLan =1;

    public Game(final GamePanel gamePanel, final SurfaceHolder surfaceHolder) {
        this.gamePanel = gamePanel;
        this.surfaceHolder = surfaceHolder;

        timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {
                if(dangChay)
                {
                    // goi thao tac cap nhat
                    // goi thao tac ve lai
                    gamePanel.capnhat();
                    Canvas canvas = surfaceHolder.lockCanvas();
                    if(canvas != null) {
                        gamePanel.draw(canvas);
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                    // in ra de xem vong lap nhe
                    Log.d("Lan: ", ""+soLan++);
                }else
                {
                    timer.cancel();
                }
            }
        };
    }

    @Override
    public void run() {
        super.run();
        // co nghia la 1000/30 mili giay se goi thuc thi task 1 lan
        timer.scheduleAtFixedRate(task, 0, 1000/30);
    }
}

Lớp GamePanel

package vn.cusc.javagame2d;

import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceView;

/**
 * Created by ntdan on 2/7/17.
 */

public class GamePanel extends SurfaceView {
    Game game;

    // cac doi tuong can ve

    public GamePanel(Context context) {
        super(context);
        game = new Game(this, this.getHolder());
    }

    public void chay()
    {
        // tien hanh phan luong
        // luong se thuc thi noi dung o ham run cua lop Game
        game.start();
    }

    public void dung()
    {
        game.dangChay = false;
        game.interrupt();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        ve(canvas);
    }

    public void capnhat()
    {
        // cap nhat cac doi tuong
    }

    public void ve(Canvas canvas)
    {
        // ve lai
    }
}

Thay thế giao diện ứng dụng bằng trò chơi

package vn.cusc.javagame2d;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    GamePanel gamePanel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //setContentView(R.layout.activity_main);

        gamePanel = new GamePanel(MainActivity.this);

        setContentView(gamePanel);
    }

    @Override
    protected void onResume() {
        super.onResume();

        gamePanel.chay();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        gamePanel.dung();
    }
}

Dừng bài 02 đây nhé =>>

Advertisements

Phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s