zoukankan      html  css  js  c++  java
  • Android_(游戏)打飞机05:处理子弹,击中敌机,添加计分板

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

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

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

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

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

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

    处理子弹,击中敌机,添加计分板效果

    package com.example.administrator.myapplication;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.WindowManager;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    /**
     * Created by Administrator on 2018/8/9.
     */
    
    public class dafeijiGameView extends SurfaceView implements
            SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{
    
        private Bitmap my;//自己
        private Bitmap baozha;//爆炸
        private Bitmap bg;//背景
        private Bitmap diren;//敌人
        private Bitmap zidan;//子弹
        private Bitmap erjihuancun;//二级缓存
        private WindowManager windowManager;//获得界面长宽高
        private int display_w;  //界面的宽
        private int display_h;  //界面的高
        private ArrayList<GameImage> gameImage = new ArrayList();
        private ArrayList<Zidan> zidans = new ArrayList<Zidan>();
    
        public dafeijiGameView(Context context) {
            super(context);
            getHolder().addCallback(this);
            //事件注册
            this.setOnTouchListener(this);
        }
    
        private void init(){
            //加载照片
            my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
            baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
            bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
            diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
            zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan);
    
            erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
            gameImage.add(new BeijingImage(bg));    //先加入背景照片
            gameImage.add(new FeijiImage(my));
            gameImage.add(new DijiImage(diren,baozha));
    
        }
    
        FeijiImage selectfeiji;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //手接近屏幕产生的事件
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                for(GameImage game: gameImage){
                    if(game instanceof FeijiImage){
    
                        FeijiImage feiji = (FeijiImage)game;
    
                        //判断条件为真时选中飞机
                        if(feiji.getX()<event.getX()&&
                                feiji.getY()<event.getY()&&
                                feiji.getX()+feiji.getWidth()>event.getX() &&
                                feiji.getY()+feiji.getHeigth()>event.getY()){
                            selectfeiji=feiji;
    
                        }else{
                            selectfeiji=null;
                        }
                        break;
                    }
                }
            }else if(event.getAction()==MotionEvent.ACTION_MOVE){
                //移动鼠标
                if( selectfeiji!=null){
                    selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
                    selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
                }
    
            }else if(event.getAction()==MotionEvent.ACTION_UP){
                //松开鼠标
                selectfeiji=null;
            }
    
            return true;
        }
    
    
        private interface GameImage{
            public Bitmap getBitmap();
            public int getX();
            public int getY();
    
        }
    
        private class Zidan implements GameImage{
    
            Bitmap zidan;
            private FeijiImage feiji;
            private int x;
            private int y;
    
            public Zidan(FeijiImage feiji,Bitmap zidan){
                this.feiji=feiji;
                this.zidan=zidan;
    
                x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置
                y=feiji.getY()-zidan.getHeight();
            }
    
            public Bitmap getBitmap() {
                y-=19;
                if(y<=-10){
                    zidans.remove(this);
                }
                return zidan;
            }
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
        }
    
        private class DijiImage implements GameImage{
    
            private Bitmap diren = null;
    
            private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
            private List<Bitmap> baozhas = new ArrayList<Bitmap>();
            private int x;
            private int y;
            private int width;
            private int height;
    
            public DijiImage(Bitmap diren,Bitmap baozha){
                this.diren=diren;
                bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight()));
    
                baozhas.add(Bitmap.createBitmap(baozha,0,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*1,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*2,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*3,0,baozha.getWidth()/4,baozha.getHeight()/2));
    
                baozhas.add(Bitmap.createBitmap(baozha,0,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*1,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*2,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*3,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
    
    
                width=diren.getWidth()/4;
                height=diren.getHeight();
    
                y=-diren.getHeight();
                Random ran = new Random();
                x=ran.nextInt(display_w-(diren.getWidth()/4));
    
            }
    
            private int index=0;
            private int num =0;
            @Override
            public Bitmap getBitmap() {
                Bitmap bitmap = bitmaps.get(index);
                //控制切换四个飞机的频率
                if(num == 7){
                    index++;
                    //当爆炸动画运行一次时候删除爆炸效果
                    if(index==8 &&state){
                        gameImage.remove(this);
                    }
    
                    if(index == bitmaps.size()){
                        index=0;
                    }
                    num=0;
                }
                y+=dijiyidong;
                num++;
    
                if(y>display_h){
                    gameImage.remove(this);
                }
    
                return bitmap;
            }
    
            //判断敌机是否被击中
            private boolean state=false;
            //受到攻击
            public void shoudaogongji(ArrayList<Zidan> zidans){
    
                if(!state){
                for(GameImage zidan:(List<GameImage>)zidans.clone()){
    
                   if(zidan.getX()>x&&zidan.getY()>y
                           &&zidan.getX()<x+width
                           &&zidan.getY()<y+height){
                            //子弹击中敌机了
                       zidans.remove(zidan);
                       state=true;
                       bitmaps=baozhas;
                       fenshu+=10;
                       break;
                      }
                    }
                }
            }
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
    
        }
    
    
    
        private class FeijiImage implements GameImage{
    
            private Bitmap my;
            private int x;
            private int y;
            private int width;
            private int heigth;
    
            private int getWidth(){
                return width;
            }
    
            private int getHeigth(){
                return heigth;
            }
    
            private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
    
            private  FeijiImage(Bitmap my){
                this.my=my;
                bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
                //得到战机的高和宽
                width=my.getWidth()/4;
                heigth=my.getHeight();
                x=(display_w - my.getWidth()/4)/2;
                y=display_h-my.getHeight()-30;
            }
    
            private int index=0;
            private int num =0;
            @Override
            public Bitmap getBitmap() {
                Bitmap bitmap = bitmaps.get(index);
                //控制切换四个飞机的频率
                if(num == 7){
                    index++;
                    if(index == bitmaps.size()){
                        index=0;
                    }
                    num=0;
                }
                num++;
                return bitmap;
            }
    
    
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
    
            public void setY(int y){
                this.y=y;
            }
    
            public void setX(int x){
                this.x=x;
            }
    
        }
    
        //负责背景照片的处理
        private class BeijingImage implements GameImage{
            private Bitmap bg;
            private BeijingImage(Bitmap bg){
                this.bg=bg;
                newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
            }
    
            private Bitmap newBitmap = null;
            private int height = 0;
    
            public Bitmap getBitmap(){
                Paint p = new Paint();
                Canvas canvas = new Canvas(newBitmap);
                canvas.drawBitmap(bg,
                        new Rect(0,0,bg.getWidth(),bg.getHeight()),
                        new Rect(0,height,display_w,display_h+height),p);
    
                canvas.drawBitmap(bg,
                        new Rect(0,0,bg.getWidth(),bg.getHeight()),
                        new Rect(0,-display_h+height,display_w,height),p);
    
                height++;
                if(height==display_h){
                    height=0;
                }
                return newBitmap;
            }
    
    
    
            public int getX(){
                return 0;
            }
    
            public int getY(){
                return 0;
            }
        }
    
    
        private boolean state = false;
        private SurfaceHolder holder;
        private long fenshu=0;
        private int guanka=1;
    
        private int chudishu=50;        //出敌机的数字
        private int dijiyidong=5;       //敌机的移动
        private int xiayiguan=50;       //下一关分数
    
        private int[][] sj={
                {1,50,50,4},
                {2,100,45,4},
                {3,150,40,5},
                {4,200,35,5},
                {5,300,30,6},
                {6,400,30,6},
                {7,500,25,7},
                {8,650,25,7},
                {9,900,20,8},
                {10,1200,20,9}};
    
        private boolean stopState=false;
        public void stop(){
            stopState=true;
        }
    
        public void start(){
            stopState=false;
            thread.interrupt(); //叫醒线程
        }
    
        //绘画中心
        public void run() {
            Paint p1 = new Paint();
            int diren_num=0;//
            int zidan_num=0;
            //绘画分数的笔
            Paint p2=new Paint();
            p2.setColor(Color.WHITE);
            p2.setTextSize(30);
            p2.setDither(true);
            p2.setAntiAlias(true);
    
            try{
                while(state){
                        while(stopState){
                            try{
                                Thread.sleep(1000000);
                            }catch(Exception e){
                            }
                        }
                    if(selectfeiji!=null){
                        if(zidan_num==10){
                            zidans.add(new Zidan(selectfeiji,zidan));
                            zidan_num=0;
                        }
                        zidan_num++;
                    }
    
                    Canvas newCanvas = new Canvas(erjihuancun);
                    for(GameImage image:(List<GameImage>)gameImage.clone()){
                        if(image instanceof DijiImage){
                            //把子弹告诉敌机
                            ((DijiImage)image).shoudaogongji(zidans);
                        }
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    for(GameImage image:(List<GameImage>)zidans.clone()){
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    //分数
                    newCanvas.drawText("分数:"+fenshu,0,30,p2);
                    newCanvas.drawText("关卡:"+guanka,0,60,p2);
                    newCanvas.drawText("下一关:"+xiayiguan,0,90,p2);
    
                    //升级关卡
                    if(sj[guanka-1][1]<=fenshu){
    
                        chudishu=sj[guanka][2]; //出敌机的数字
                        dijiyidong=sj[guanka][3];
                        fenshu=sj[guanka-1][1]-fenshu;
                        xiayiguan=sj[guanka][1];
                        guanka=sj[guanka][0];
                    }
    
                    if(diren_num==150){
                        diren_num=0;
                        gameImage.add(new DijiImage(diren,baozha));
                    }
                    diren_num++;
                    Canvas canvas = holder.lockCanvas();
                    canvas.drawBitmap(erjihuancun,0,0,p1);
                    holder.unlockCanvasAndPost(canvas);
                    Thread.sleep(10);
                }
            }catch(Exception e){
            }
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
        }
    
    
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            state = false;
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            //得到屏幕的宽和高
            display_w=width;
            display_h=height;
            init();
            this.holder=holder;
            state = true;
            thread=new Thread(this);
            thread.start();
        }
    
        Thread  thread=null;
    }
    dafeijiGameView.java
    package com.example.administrator.myapplication;
    
    
    import android.content.DialogInterface;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    
    
    public class MainActivity extends AppCompatActivity implements DialogInterface.OnClickListener{
    
        dafeijiGameView view  = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //去掉标题
           // requestWindowFeature(Window.FEATURE_NO_TITLE);
              dafeijiGameView view =  new dafeijiGameView(this);
            view = new dafeijiGameView(this);
            setContentView(view);
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            if(keyCode==KeyEvent.KEYCODE_BACK){
                view.stop();
    
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setTitle("确定是否退出");
                alert.setNeutralButton("退出",this);
                alert.setNegativeButton("继续",this);
                alert.create().show();
    
                return false;
            }
    
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if(which==-2){
                view.start();;
            }else{
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        }
    }
    MainActivity.java

    实现过程

    处理子弹

    当子弹击中敌机时,移除当前子弹

      把子弹告诉敌机

                   for(GameImage image:(List<GameImage>)gameImage.clone()){
                        if(image instanceof DijiImage){
                            
                            ((DijiImage)image).shoudaogongji(zidans);
                        }
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }

    当子弹击中敌机时,移除当前子弹

      在制作过程中发现判断子弹击中敌机时,如果不移除子弹。会在子弹进入敌机身体的时候,继续判断子弹击中敌机(造成一颗子弹击中三次敌机)

    for(GameImage game: gameImage){
                    if(game instanceof FeijiImage){
    
                        FeijiImage feiji = (FeijiImage)game;
    
                        //判断条件为真时选中飞机
                        if(feiji.getX()<event.getX()&&
                                feiji.getY()<event.getY()&&
                                feiji.getX()+feiji.getWidth()>event.getX() &&
                                feiji.getY()+feiji.getHeigth()>event.getY()){
                            selectfeiji=feiji;
    
                        }else{
                            selectfeiji=null;
                        }
                        break;
                    }
                }
     public void shoudaogongji(ArrayList<Zidan> zidans){
    
                for(GameImage zidan:(List<GameImage>)zidans.clone()){
    
                    if(zidan.getX()>x&&zidan.getY()>y
                            &&zidan.getX()<x+width
                            &&zidan.getY()<y+height){
                        //子弹击中敌机了
                        zidans.remove(zidan);
                        break;
                    }
    
                }
    
            }

    package com.example.administrator.myapplication;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.WindowManager;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    /**
     * Created by Administrator on 2018/8/9.
     */
    
    public class dafeijiGameView extends SurfaceView implements
            SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{
    
        private Bitmap my;//自己
        private Bitmap baozha;//爆炸
        private Bitmap bg;//背景
        private Bitmap diren;//敌人
        private Bitmap zidan;//子弹
        private Bitmap erjihuancun;//二级缓存
        private WindowManager windowManager;//获得界面长宽高
        private int display_w;  //界面的宽
        private int display_h;  //界面的高
        private ArrayList<GameImage> gameImage = new ArrayList();
        private ArrayList<Zidan> zidans = new ArrayList<Zidan>();
    
        public dafeijiGameView(Context context) {
            super(context);
            getHolder().addCallback(this);
            //事件注册
            this.setOnTouchListener(this);
        }
    
        private void init(){
            //加载照片
            my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
            baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
            bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
            diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
            zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan);
    
            erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
            gameImage.add(new BeijingImage(bg));    //先加入背景照片
            gameImage.add(new FeijiImage(my));
            gameImage.add(new DijiImage(diren));
    
        }
    
        FeijiImage selectfeiji;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //手接近屏幕产生的事件
            if(event.getAction()==MotionEvent.ACTION_DOWN){
                for(GameImage game: gameImage){
                    if(game instanceof FeijiImage){
    
                        FeijiImage feiji = (FeijiImage)game;
    
                        //判断条件为真时选中飞机
                        if(feiji.getX()<event.getX()&&
                                feiji.getY()<event.getY()&&
                                feiji.getX()+feiji.getWidth()>event.getX() &&
                                feiji.getY()+feiji.getHeigth()>event.getY()){
                            selectfeiji=feiji;
    
                        }else{
                            selectfeiji=null;
                        }
                        break;
                    }
                }
            }else if(event.getAction()==MotionEvent.ACTION_MOVE){
                //移动鼠标
                if( selectfeiji!=null){
                    selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
                    selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
                }
    
            }else if(event.getAction()==MotionEvent.ACTION_UP){
                //松开鼠标
                selectfeiji=null;
            }
    
            return true;
        }
    
    
        private interface GameImage{
            public Bitmap getBitmap();
            public int getX();
            public int getY();
    
        }
    
        private class Zidan implements GameImage{
    
            Bitmap zidan;
            private FeijiImage feiji;
            private int x;
            private int y;
    
            public Zidan(FeijiImage feiji,Bitmap zidan){
                this.feiji=feiji;
                this.zidan=zidan;
    
                x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置
                y=feiji.getY()-zidan.getHeight();
            }
    
            public Bitmap getBitmap() {
                y-=19;
                if(y<=-10){
                    zidans.remove(this);
                }
                return zidan;
            }
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
        }
    
        private class DijiImage implements GameImage{
    
            private Bitmap diren = null;
    
            private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
            private int x;
            private int y;
            private int width;
            private int height;
    
            public DijiImage(Bitmap diren){
                this.diren=diren;
                bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
                bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight()));
    
                width=diren.getWidth()/4;
                height=diren.getHeight();
    
                y=-diren.getHeight();
                Random ran = new Random();
                x=ran.nextInt(display_w-(diren.getWidth()/4));
    
            }
    
            private int index=0;
            private int num =0;
            @Override
            public Bitmap getBitmap() {
                Bitmap bitmap = bitmaps.get(index);
                //控制切换四个飞机的频率
                if(num == 7){
                    index++;
                    if(index == bitmaps.size()){
                        index=0;
                    }
                    num=0;
                }
                y+=3;
                num++;
    
                if(y>display_h){
                    gameImage.remove(this);
                }
    
                return bitmap;
            }
    
            //受到攻击
            public void shoudaogongji(ArrayList<Zidan> zidans){
    
                for(GameImage zidan:(List<GameImage>)zidans.clone()){
    
                    if(zidan.getX()>x&&zidan.getY()>y
                            &&zidan.getX()<x+width
                            &&zidan.getY()<y+height){
                        //子弹击中敌机了
                        zidans.remove(zidan);
                        break;
                    }
    
                }
    
            }
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
        }
    
    
    
        private class FeijiImage implements GameImage{
    
            private Bitmap my;
            private int x;
            private int y;
            private int width;
            private int heigth;
    
            private int getWidth(){
                return width;
            }
    
            private int getHeigth(){
                return heigth;
            }
    
            private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
    
            private  FeijiImage(Bitmap my){
                this.my=my;
                bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
                bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
                //得到战机的高和宽
                width=my.getWidth()/4;
                heigth=my.getHeight();
                x=(display_w - my.getWidth()/4)/2;
                y=display_h-my.getHeight()-30;
            }
    
            private int index=0;
            private int num =0;
            @Override
            public Bitmap getBitmap() {
                Bitmap bitmap = bitmaps.get(index);
                //控制切换四个飞机的频率
                if(num == 7){
                    index++;
                    if(index == bitmaps.size()){
                        index=0;
                    }
                    num=0;
                }
                num++;
                return bitmap;
            }
    
    
    
            @Override
            public int getX() {
                return x;
            }
    
            @Override
            public int getY() {
                return y;
            }
    
            public void setY(int y){
                this.y=y;
            }
    
            public void setX(int x){
                this.x=x;
            }
    
        }
    
        //负责背景照片的处理
        private class BeijingImage implements GameImage{
            private Bitmap bg;
            private BeijingImage(Bitmap bg){
                this.bg=bg;
                newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
            }
    
            private Bitmap newBitmap = null;
            private int height = 0;
    
            public Bitmap getBitmap(){
                Paint p = new Paint();
                Canvas canvas = new Canvas(newBitmap);
                canvas.drawBitmap(bg,
                        new Rect(0,0,bg.getWidth(),bg.getHeight()),
                        new Rect(0,height,display_w,display_h+height),p);
    
                canvas.drawBitmap(bg,
                        new Rect(0,0,bg.getWidth(),bg.getHeight()),
                        new Rect(0,-display_h+height,display_w,height),p);
    
                height++;
                if(height==display_h){
                    height=0;
                }
                return newBitmap;
            }
    
    
    
            public int getX(){
                return 0;
            }
    
            public int getY(){
                return 0;
            }
        }
    
    
        private boolean state = false;
        private SurfaceHolder holder;
    
        //绘画中心
        public void run() {
            Paint p1 = new Paint();
            int diren_num=0;//
            int zidan_num=0;
            try{
                while(state){
                    if(selectfeiji!=null){
                        if(zidan_num==10){
                            zidans.add(new Zidan(selectfeiji,zidan));
                            zidan_num=0;
                        }
                        zidan_num++;
                    }
    
                    Canvas newCanvas = new Canvas(erjihuancun);
                    for(GameImage image:(List<GameImage>)gameImage.clone()){
                        if(image instanceof DijiImage){
                            //把子弹告诉敌机
                            ((DijiImage)image).shoudaogongji(zidans);
                        }
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    for(GameImage image:(List<GameImage>)zidans.clone()){
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    if(diren_num==150){
                        diren_num=0;
                        gameImage.add(new DijiImage(diren));
                    }
                    diren_num++;
                    Canvas canvas = holder.lockCanvas();
                    canvas.drawBitmap(erjihuancun,0,0,p1);
                    holder.unlockCanvasAndPost(canvas);
                    Thread.sleep(10);
                }
            }catch(Exception e){
            }
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
        }
    
    
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            state = false;
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            //得到屏幕的宽和高
            display_w=width;
            display_h=height;
            init();
            this.holder=holder;
            state = true;
            new Thread(this).start();
        }
    
    }
    dafeijiGameView.java
    package com.example.administrator.myapplication;
    
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    
    public class MainActivity extends AppCompatActivity{
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //去掉标题
            // requestWindowFeature(Window.FEATURE_NO_TITLE);
            dafeijiGameView view =  new dafeijiGameView(this);
    
            setContentView(view);
        }
    
    
    }
    MainActivity.java

    绘制爆炸动画

      将爆炸图片分成八分,从左上角第一张爆炸到最后一张

     private List<Bitmap> baozhas = new ArrayList<Bitmap>();

      将八张图片分别加入链表

     baozhas.add(Bitmap.createBitmap(baozha,0,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*1,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*2,0,baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*3,0,baozha.getWidth()/4,baozha.getHeight()/2));
    
                baozhas.add(Bitmap.createBitmap(baozha,0,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*1,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*2,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));
                baozhas.add(Bitmap.createBitmap(baozha,(baozha.getWidth()/4)*3,baozha.getHeight()/2,
                        baozha.getWidth()/4,baozha.getHeight()/2));

      前面四张图片都在y轴上方,  bitmaps.add(Bitmap.createBitmap())第二个参数分别取爆炸图x轴上的第一张、第二张、第三张、第四张,第三个参数为都为0表示y轴上方的图片

      后面四张图片在y轴下方,同理,第二个参数取x轴方向上的第一张、第二张、第三张、第四张,第三个参数为都为baozha.getHeight()/2表示y轴下方的图片

      当判断子弹击中敌机时,生成爆炸效果  

     //判断敌机是否被击中
            private boolean state=false;
            //受到攻击
            public void shoudaogongji(ArrayList<Zidan> zidans){
    
                if(!state){
                    for(GameImage zidan:(List<GameImage>)zidans.clone()){
    
                        if(zidan.getX()>x&&zidan.getY()>y
                                &&zidan.getX()<x+width
                                &&zidan.getY()<y+height){
                            //子弹击中敌机了
                            zidans.remove(zidan);
                            state=true;
                            bitmaps=baozhas;
                            break;
                        }
                    }
                }
            }

      处理到这时发现爆炸效果会一直循环出现,而我们只需要当爆炸效果出现一次后就消失,还需要的对爆炸效果动画进行处理

     public Bitmap getBitmap() {
                Bitmap bitmap = bitmaps.get(index);
                //控制切换四个飞机的频率
                if(num == 7){
                    index++;
                    //当爆炸动画运行一次时候删除爆炸效果
                    if(index==8 &&state){
                        gameImage.remove(this);
                    }
    
                    if(index == bitmaps.size()){
                        index=0;
                    }
                    num=0;
                }
                y+=dijiyidong;
                num++;
    
                if(y>display_h){
                    gameImage.remove(this);
                }
    
                return bitmap;
            }

    分数和关卡

    添加文本

      绘画分数的笔

            Paint p1 = new Paint();
            int diren_num=0;//
            int zidan_num=0;
            
            Paint p2=new Paint();
            p2.setColor(Color.WHITE);
            p2.setTextSize(30);
            p2.setDither(true);
            p2.setAntiAlias(true);
     private boolean state = false;
        private SurfaceHolder holder;
        private long fenshu=0;
        private int guanka=1;
    
        private int chudishu=50;        //出敌机的数字
        private int dijiyidong=5;       //敌机的移动
        private int xiayiguan=50;       //下一关分数
    
        private int[][] sj={
                {1,50,50,4},
                {2,100,45,4},
                {3,150,40,5},
                {4,200,35,5},
                {5,300,30,6},
                {6,400,30,6},
                {7,500,25,7},
                {8,650,25,7},
                {9,900,20,8},
                {10,1200,20,9}};

      判断关卡,当分数达到要求时进行下一关

             //分数
                    newCanvas.drawText("分数:"+fenshu,0,30,p2);
                    newCanvas.drawText("关卡:"+guanka,0,60,p2);
                    newCanvas.drawText("下一关:"+xiayiguan,0,90,p2);
    
                    //升级关卡
                    if(sj[guanka-1][1]<=fenshu){
    
                        chudishu=sj[guanka][2]; //出敌机的数字
                        dijiyidong=sj[guanka][3];
                        fenshu=sj[guanka-1][1]-fenshu;
                        xiayiguan=sj[guanka][1];
                        guanka=sj[guanka][0];
                    }

      增加敌机速度在 Bitmap getBitmap()中

                y+=dijiyidong;
                num++;

       添加游戏关卡

        private int[][] sj={
                {1,50,50,4},
                {2,100,45,4},
                {3,150,40,5},
                {4,200,35,5},
                {5,300,30,6},
                {6,400,30,6},
                {7,500,25,7},
                {8,650,25,7},
                {9,900,20,8},
                {10,1200,20,9}};

      第一个参数:关卡

      第二个参数:达到分数进入下一个关卡  

      第三个参数:自己飞机向前飞行频率

      第四个参数:敌机向下飞行速度

    (如需转载学习,请标明出处)
  • 相关阅读:
    android 模拟器手机如何添加文件到sd卡?
    Asp.Net 前台和后台交互的一些问题
    Cannot get WiFi AP state 错误
    MediaPlayer.getCurrentPosition IllegalStateException错误
    SQL Compare 错误 给定关键字不在字典中
    java.net.SocketException: Connection timed out的一种情况
    System services not available to Activities before onCreate()
    java.net.SocketException: Connection reset by peer
    卸载Microsoft Virtual WiFi Miniport Adapter 方法
    java 跳出 if
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9459400.html
Copyright © 2011-2022 走看看