前言:
看了不少Andriod游戲開發方面的博客,發現大多都是講解某一方面的知識,沒有一個完整的開發教程。
所以我就寫了這樣一個系列的博客,完整的描述整個游戲的開發過程。
希望能給大家一點幫助,同時也希望大家能給出好的建議。我們共同學習~
好了進入正題:
這是第一篇,裡面涉及到的東西都比較基礎~~~
1.游戲介紹:這次編寫的游戲是一款跳躍類游戲,類似與塗鴉跳躍。我們通過小球觸碰方塊,完成小球的跳躍。我們將在這一列的博客中來實現這款游戲的開發。
2.最終成品展示:
這個是程序的最終效果。每個小方塊都有許多運動方式,水平的,垂直的,靜止的,圓周運動的。。。同時每個小方塊都有不同的屬性。有的碰到會消失,有的彈性更好等等。。。具體的設計方法我會後面幾篇文章詳細介紹。童鞋們也可以先自己想想看,怎麼設計這個游戲。
3.這節課主要完成基本框架的搭建:我們采用SurfaceView實現游戲,(View一般用來做那些不需要一直刷新的游戲:如五子棋,連連看之類的)。
SurfaceView默認實現雙緩沖。所以在效率上會高一點。
所謂雙緩沖簡單的理解就是把要畫在屏幕上的圖案,先畫到一張畫布(如Bitmap)上,然後再把這張畫布直接畫到屏幕上,這樣就可以避免閃爍現象。
我們先建一個Android project。
然後建一個GameView。也就是SurfaceView的子類。項目的機構圖:
附上代碼:
Java代碼
- package jumpball.game;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.DisplayMetrics;
- import android.view.Window;
- import android.view.WindowManager;
-
- public class GameActivity extends Activity {
- GameView mView;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- requestWindowFeature(Window.FEATURE_NO_TITLE);// 設置無標題
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);// 設置全屏模式
- //獲取系統的屏幕屬性
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
-
- mView = new GameView(this, dm.widthPixels, dm.heightPixels);
- //應用這個布局
- setContentView(mView);
- }
- }
GameView.java
Java代碼
- package jumpball.game;
-
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.SurfaceHolder.Callback;
-
- //本身就是一個Runnable接口
- public class GameView extends SurfaceView implements Callback, Runnable {
- public int width, height;
- private Canvas mCanvas;
- //刷新界面線程
- private Thread mThread;
- //處理者
- private SurfaceHolder mSurfaceHolder;
- private boolean mIsRunning = false;
- private int TIME_IN_FRAME = 50;
- GameActivity gameActivity;
-
- public GameView(Context context, int width, int height) {
- super(context);
- //setFocusable(true);
- //activity是 context的一個子類。
- gameActivity = (GameActivity) context;
- this.width = width;
- this.height = height;
-
- mSurfaceHolder = getHolder();
- mSurfaceHolder.addCallback(this);
- }
-
- public void mDraw() {
- //設置畫布的顏色
- mCanvas.drawColor(Color.WHITE);
- drawBG(mCanvas);
- }
-
- public void drawBG(Canvas mCanvas) {
- Paint mPaint = new Paint();
- mPaint.setColor(Color.BLACK);
- //設置透明度
- mPaint.setAlpha(50);
- //設置抗鋸齒
- mPaint.setAntiAlias(true);
- float h = height * 0.01666667f;
- for (int i = 0; i < height; i += h) {
- mCanvas.drawLine(0, i, width, i, mPaint);
- }
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- }
-
- public void surfaceCreated(SurfaceHolder holder) {
- mIsRunning = true;
- //新建一個刷屏線程
- mThread = new Thread(this);
- mThread.start();
- }
-
- public void surfaceDestroyed(SurfaceHolder holder) {
- //銷毀這個,
- mIsRunning=false;
- }
-
- public void run() {
- //決定線程是否繼續執行
- while (mIsRunning) {
- long startTime = System.currentTimeMillis();
- //調用mDraw進行繪制
- synchronized (mSurfaceHolder) {
- mCanvas = mSurfaceHolder.lockCanvas();
- mDraw();
- mSurfaceHolder.unlockCanvasAndPost(mCanvas);
- }
-
- long endTime = System.currentTimeMillis();
-
- int diffTime = (int) (endTime - startTime);
-
- while (diffTime < TIME_IN_FRAME) {
- diffTime = (int) (System.currentTimeMillis() - startTime);
- Thread.yield();
- }
- }
- }
- }
上一個最終的運行效果圖:
源碼下載地址 http://www.linuxidc.com/Linux/2012-02/54645p4.htm