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. }  

上一个最终的运行效果图:

源码下载地址

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容