前言:
  看了不少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;    
-     
-   
- 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);    
-           
-           
-         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();    
-               
-             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