本博文适合刚刚学完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); } }