本博文适合刚刚学完android基础准备做做项目实战一下的人看,在我的博文中,我会将这个游戏的开发过程讲得非常详细,所以非常容易理解,植物大战僵尸这个游戏我会出一系列的博文详细解释,所以有兴趣的人可以持续跟进哦!
一:制作游戏必备的三个API
(1)SurfaceView:类似于于展示电影的屏幕,这个API是一个非常强大的API,它的内部是一个双缓冲机制,显示界面的效率非常快。那么什么
是双缓冲机制呢?
例如有一个A和一个B两个线程,
A:如果A先加载数据,加载数据完成之后显示界面
B:同时B先显示界面,显示完成时候B再加载数据
这个双缓冲机制的意思就是这两个线程可以同时存在,一个加载数据,另一个显示界面,这样的交叉加载显示会是游戏的运行效率非常快。
SurfaceView有两个主要的功能:
①提供一个可以绘制的surface
②可以在多个线程同时修改界面,如果想要在多个线程中修改界面,就要注意两个前提条件:
1.将所有的surface在主线程中被调用
2..将所有的surfaceHolder.callback在主线程中被调用
package game.qiu.com.game;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 这是游戏的UI类
* 如果想让SurfaceHolder.Callback生效,我们必须要去调用
* SurfaceHolder.addCallback(SurfaceHolder.Callback)
* 这样的一个方法,这样就可以保证实现SurfaceHolder.Callback的这
* 三个方法能够生效
*/
public class GameUI extends SurfaceView implements SurfaceHolder.Callback{
private RenderThread renderThread;
private boolean flag;// 线程运行的一个标记
public GameUI(Context context) {
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);//保证surfaceCreated,surfaceChanged,surfaceDestroyed能够生效
}
private class RenderThread extends Thread{
@Override
public void run() {
while(flag){
}
}
}
//当surface创建的时候调用
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d("surfaceCreated----->","surface创建的时候调用");
renderThread = new RenderThread();
flag=true;
renderThread.start();//开启线程.....
}
//当surface的大小改变的时候调用,一般的改变是当前显示的界面的改变
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.d("surfaceCreated----->","surface大小改变的时候调用");
}
//当surface销毁的时候调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("surfaceCreated----->","surface销毁的时候调用");
//renderThread.stop();//停止线程,因为这个方法有一些安全隐患,所以java工程师
//已经不建议我们通过这个方法去停止线程了,所以我们停止线程都是通过线程的一个循环,让线程自动停止
flag=false;//停止一个线程只要直接将标记定义为false就行了
}
}
MainActivity类:
package game.qiu.com.game;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//因为当前的gameUI是继承了surfacevuew,实现了SurfaceHolder.Callback,
// 所以我们认为这行代码在
//主线程中调用了surfaceview,同时也是调用了SurfaceHolder.Callback,
// 这样就可以在多个线程中同时修改界面
GameUI gameUI = new GameUI(getApplicationContext());
setContentView(gameUI);
}
}