Android_手把手教你写跳跃类游戏(1)

 

-----------------------------------------------------------------------------
博客已搬家:地址  博客已搬家:地址 博客已搬家:地址
-----------------------------------------------------------------------------

前言:

在CSDN上面看了不少andriod游戏开发方面的博客,发现大多都是讲解某一方面的知识,没有一个完整的开发教程。

所以我就写了这样一个系列的博客,完整的描述整个游戏的开发过程。

希望能给大家一点帮助,同时也希望大家能给出好的建议。我们共同学习~

作者只是一个普普通通的andriod初学者,如果在博客有错误的地方,麻烦联系我。我会修改的~

好了进入正题:

这是第一篇博客,里面涉及到的东西都比较基础~~~

1.游戏介绍:这次编写的游戏是一款跳跃类游戏,类似与涂鸦跳跃。我们通过小球触碰方块,完成小球的跳跃。我们将在这一列的博客中来实现这款游戏的开发。

2.最终成品展示

Android_手把手教你写跳跃类游戏(1)_第1张图片                        

这个是程序的最终效果。每个小方块都有许多运动方式,水平的,垂直的,静止的,圆周运动的。。。同时每个小方块都有不同的属性。有的碰到会消失,有的弹性更好等等。。。具体的设计方法我会后面几篇文章详细介绍。童鞋们也可以先自己想想看,怎么设计这个游戏。

3.这节课主要完成基本框架的搭建:我们采用SurfaceView实现游戏,(View一般用来做那些不需要一直刷新的游戏:如五子棋,连连看之类的)。

SurfaceView默认实现双缓冲。所以在效率上会高一点。

所谓双缓冲简单的理解就是把要画在屏幕上的图案,先画到一张画布(Bitmap)上,然后再把这张画布直接画到屏幕上,这样就可以避免闪烁现象。

我们先建一个android project。

然后建一个GameView。也就是SurfaceView的子类。项目的机构图:

Android_手把手教你写跳跃类游戏(1)_第2张图片

 

附上代码:

GameActivity.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
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();
			}
		}
	}
}

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

 源码下载地址请看最终版!

你可能感兴趣的:(thread,游戏,android,Class,callback)