歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android游戲開發教程:手教你寫跳躍類游戲

前言:

看了不少Andriod游戲開發方面的博客,發現大多都是講解某一方面的知識,沒有一個完整的開發教程。

所以我就寫了這樣一個系列的博客,完整的描述整個游戲的開發過程。

希望能給大家一點幫助,同時也希望大家能給出好的建議。我們共同學習~

作者只是一個普普通通的andriod初學者,如有錯誤的地方,麻煩聯系我。我會修改的~

好了進入正題:

這是第一篇,裡面涉及到的東西都比較基礎~~~

1.游戲介紹:這次編寫的游戲是一款跳躍類游戲,類似與塗鴉跳躍。我們通過小球觸碰方塊,完成小球的跳躍。我們將在這一列的博客中來實現這款游戲的開發。

2.最終成品展示

                        

這個是程序的最終效果。每個小方塊都有許多運動方式,水平的,垂直的,靜止的,圓周運動的。。。同時每個小方塊都有不同的屬性。有的碰到會消失,有的彈性更好等等。。。具體的設計方法我會後面幾篇文章詳細介紹。童鞋們也可以先自己想想看,怎麼設計這個游戲。

3.這節課主要完成基本框架的搭建:我們采用SurfaceView實現游戲,(View一般用來做那些不需要一直刷新的游戲:如五子棋,連連看之類的)。

SurfaceView默認實現雙緩沖。所以在效率上會高一點。

所謂雙緩沖簡單的理解就是把要畫在屏幕上的圖案,先畫到一張畫布(如Bitmap)上,然後再把這張畫布直接畫到屏幕上,這樣就可以避免閃爍現象。

我們先建一個Android project。

然後建一個GameView。也就是SurfaceView的子類。項目的機構圖:

 

附上代碼:

GameActivity.java

[java] view plaincopyprint?
  1. package jumpball.game;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.DisplayMetrics;  
  6. import android.view.Window;  
  7. import android.view.WindowManager;  
  8.   
  9. public class GameActivity extends Activity {  
  10.     GameView mView;  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.           
  14.         requestWindowFeature(Window.FEATURE_NO_TITLE);// 設置無標題   
  15.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  16.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);// 設置全屏模式   
  17.         //獲取系統的屏幕屬性   
  18.         DisplayMetrics dm = new DisplayMetrics();  
  19.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  20.           
  21.         mView = new GameView(this, dm.widthPixels, dm.heightPixels);  
  22.         //應用這個布局   
  23.         setContentView(mView);  
  24.     }  
  25. }  
[java] view plaincopyprint?
  1. GameView.java  
[java] view plaincopyprint?
  1. package jumpball.game;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.view.SurfaceHolder;  
  8. import android.view.SurfaceView;  
  9. import android.view.SurfaceHolder.Callback;  
  10.   
  11. //本身就是一個Runnable接口   
  12. public class GameView extends SurfaceView implements Callback, Runnable {  
  13.     public int width, height;  
  14.     private Canvas mCanvas;  
  15.     //刷新界面線程   
  16.     private Thread mThread;  
  17.     //處理者   
  18.     private SurfaceHolder mSurfaceHolder;  
  19.     private boolean mIsRunning = false;  
  20.     private int TIME_IN_FRAME = 50;  
  21.     GameActivity gameActivity;  
  22.   
  23.     public GameView(Context context, int width, int height) {  
  24.         super(context);  
  25.         //setFocusable(true);   
  26.         //activity是 context的一個子類。   
  27.         gameActivity = (GameActivity) context;  
  28.         this.width = width;  
  29.         this.height = height;  
  30.           
  31.         mSurfaceHolder = getHolder();  
  32.         mSurfaceHolder.addCallback(this);  
  33.     }  
  34.   
  35.     public void mDraw() {  
  36.         //設置畫布的顏色   
  37.         mCanvas.drawColor(Color.WHITE);  
  38.         drawBG(mCanvas);  
  39.     }  
  40.   
  41.     public void drawBG(Canvas mCanvas) {  
  42.         Paint mPaint = new Paint();  
  43.         mPaint.setColor(Color.BLACK);  
  44.         //設置透明度   
  45.         mPaint.setAlpha(50);  
  46.         //設置抗鋸齒   
  47.         mPaint.setAntiAlias(true);  
  48.         float h = height * 0.01666667f;  
  49.         for (int i = 0; i < height; i += h) {  
  50.             mCanvas.drawLine(0, i, width, i, mPaint);  
  51.         }  
  52.     }  
  53.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  54.             int height) {  
  55.     }  
  56.   
  57.     public void surfaceCreated(SurfaceHolder holder) {  
  58.         mIsRunning = true;  
  59.         //新建一個刷屏線程   
  60.         mThread = new Thread(this);  
  61.         mThread.start();  
  62.     }  
  63.   
  64.     public void surfaceDestroyed(SurfaceHolder holder) {  
  65.         //銷毀這個,   
  66.         mIsRunning=false;  
  67.     }  
  68.   
  69.     public void run() {  
  70.         //決定線程是否繼續執行   
  71.         while (mIsRunning) {  
  72.             long startTime = System.currentTimeMillis();  
  73.             //調用mDraw進行繪制   
  74.             synchronized (mSurfaceHolder) {  
  75.                 mCanvas = mSurfaceHolder.lockCanvas();  
  76.                 mDraw();  
  77.                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  78.             }  
  79.               
  80.             long endTime = System.currentTimeMillis();  
  81.               
  82.             int diffTime = (int) (endTime - startTime);  
  83.               
  84.             while (diffTime < TIME_IN_FRAME) {  
  85.                 diffTime = (int) (System.currentTimeMillis() - startTime);  
  86.                 Thread.yield();  
  87.             }  
  88.         }  
  89.     }  
  90. }  

上一個最終的運行效果圖:

源碼下載地址 http://www.linuxidc.com/Linux/2012-02/54645p4.htm

Copyright © Linux教程網 All Rights Reserved