(游戏)打飞机01:前言  传送门

(游戏)打飞机02:游戏背景滚动  传送门

(游戏)打飞机03:控制玩家飞机   传送门 

(游戏)打飞机04:绘画敌机、添加子弹    传送门

(游戏)打飞机05:处理子弹,击中敌机,添加计分板   传送门

(游戏)打飞机06:后续  传送门

   

程序已放到Github上托管 : 传送门

 

 

打飞机游戏效果

Android_(游戏)打飞机01:前言

 

 

游戏中的二级缓存

 

  android之surfaceView学习:传送门

 

  制作游戏时,为了时刻渲染游戏场景,涉及到一个实时画图的问题了,对于实时更新UI这个问题,android的UI更新都需要在主线程中更新,但是如果将一个实时绘图的操作放在主线程,必定会出现阻塞主线程的问题,即便是不阻塞主线程,也会降低程序运行的速度

 

  surfaceView提供了UI线程。可以自己更新UI,因此,这样我们在surfaceView中进行实时的绘画,然后通过更改其中的绘画的数据,既可以实现我们想要的实时的更新UI的这个问题了,并且消耗较小的资源

  

  surfaceCreated:创建时需要执行的操作

  surfaceView:大小改变时需要执行的操作

  surfaceDestroyed:销毁时进行的操作

  

    //视图创建时通知
    public void surfaceCreated(SurfaceHolder holder) {
        this.holder = holder;
        runState = true;
        //视图创建时开始线程
        new Thread(this).start();
    }

    //界面发生改变的时候通知
    public void surfaceChanged(SurfaceHolder holder, int i, int i1, int i2) {

    }

    //销毁时通知
    public void surfaceDestroyed(SurfaceHolder holder) {
        runState = false;
    }

 

  线程中的方法

    public void run() {
        Random ran = new Random();

        try{
            while(true) {
                //获得绘画的画布
                Canvas canvas =  holder.lockCanvas();

                Paint p = new Paint();
                p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));

                canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);

                //把绘画好的内容提交上去
                holder.unlockCanvasAndPost(canvas);//解锁
                Thread.sleep(1000);
            }
        }catch (Exception e){

        }
    }

 

  锁住画布时,开始编辑要绘画的内容

             //锁住画布
             Canvas canvas =  holder.lockCanvas();            

  

  内容绘画好后,开始解锁

              //把绘画好的内容提交上去
                holder.unlockCanvasAndPost(canvas);//解锁

 

   制作游戏时,为了时时渲染游戏画面,线程中常用死循环

  while(true) {
                //锁住画布
                Canvas canvas =  holder.lockCanvas();

                Paint p = new Paint();
                p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));

                canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);

                //把绘画好的内容提交上去
                holder.unlockCanvasAndPost(canvas);//解锁
                Thread.sleep(1000);
            }

 

 

实现效果:

  Android_(游戏)打飞机01:前言

 

package com.example.administrator.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Random;

/**
 * Created by Administrator on 2018/8/9.
 */

public class GameView extends SurfaceView implements Runnable, SurfaceHolder.Callback{

    public GameView(Context context) {
        super(context);

        getHolder().addCallback(this);  //注册回调方法
    }

    private boolean runState = false;
    private SurfaceHolder holder = null;

    @Override
    public void run() {
        Random ran = new Random();

        try{
            while(true) {
                //获得绘画的画布
                Canvas canvas =  holder.lockCanvas();

                Paint p = new Paint();
                p.setColor(Color.rgb(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255)));

                canvas.drawLine(ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),ran.nextInt(1000),p);

                //把绘画好的内容提交上去
                holder.unlockCanvasAndPost(canvas);//解锁
                Thread.sleep(1000);
            }
        }catch (Exception e){

        }
    }

    //视图创建时通知
    public void surfaceCreated(SurfaceHolder holder) {
        this.holder = holder;
        runState = true;
        new Thread(this).start();


    }

    //界面发生改变的时候通知
    public void surfaceChanged(SurfaceHolder holder, int i, int i1, int i2) {

    }

    //销毁时通知
    public void surfaceDestroyed(SurfaceHolder holder) {
        runState = false;
    }


}
GameView.java

相关文章: