(游戏)打飞机01:前言 传送门
(游戏)打飞机02:游戏背景滚动 传送门
(游戏)打飞机03:控制玩家飞机 传送门
(游戏)打飞机04:绘画敌机、添加子弹 传送门
(游戏)打飞机05:处理子弹,击中敌机,添加计分板 传送门
(游戏)打飞机06:后续 传送门
处理子弹,击中敌机,添加计分板效果
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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; }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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()); } } }
实现过程
处理子弹
当子弹击中敌机时,移除当前子弹
把子弹告诉敌机
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; } } }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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(); } }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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); } }
绘制爆炸动画
将爆炸图片分成八分,从左上角第一张爆炸到最后一张
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}};
第一个参数:关卡
第二个参数:达到分数进入下一个关卡
第三个参数:自己飞机向前飞行频率
第四个参数:敌机向下飞行速度