(游戏)打飞机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_(游戏)打飞机05:处理子弹,击中敌机,添加计分板的更多相关文章

  1. Android_(游戏)打飞机04:绘画敌机、添加子弹

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  2. Android_(游戏)打飞机06:后续

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  3. Android_(游戏)打飞机03:控制玩家飞机

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  4. Android_(游戏)打飞机02:游戏背景滚动

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

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

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  6. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  7. 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  8. Egret学习笔记 (Egret打飞机-9.子弹对敌机和主角的碰撞)

    运行起来,虽然主角飞机和敌机都在互相发射子弹,但是子弹打中了就和没打中效果是一样的.. 这一章我们就来处理子弹和飞机的碰撞问题. 我们所有的操作都是基于Main这个容器来做的.所以我就把这个处理放到M ...

  9. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

随机推荐

  1. Collection接口的子接口——Set接口

    https://docs.oracle.com/javase/8/docs/api/java/util/Set.html public interface Set<E>  extends ...

  2. CentOS7部署Tomcat服务器

    1. 软件 存放路径:/usr/local/src apache-tomcat-9.0.22.tar.gz openjdk-12_linux-x64_bin.tar.gz 2.事先配置 启动后关闭防火 ...

  3. 删库?半个DBA的跑路经验总结

    0. 国内呆不下了,赶紧出国 首先,不要选动车,要选最近的一班飞机,尽快出国,能走高速走高速,不然选人少的路线. 没错,我们 DBA 都是常备护照的. 切记,注意看高德地图实时路况. 我们有个前辈就是 ...

  4. GitFlow入门

    1-概述 2-GitFLow分支介绍 2.1-master 分支 2.2-develop 分支 2.3-feature 分支 2.4-release 分支 2.5-hotfix 分支 3-GitFlo ...

  5. mybatis-generator遇到到的问题

    1.Unknown system variable 'query_cache_size' https://blog.csdn.net/qq_21870555/article/details/80711 ...

  6. 使用python的selenium库刷超星网课

    网课很多看不完呀 所以动手做了一个基础的自动答题和下一节的程序 用到了python 3 selenium Chrome 如何自动化Chrome?https://www.cnblogs.com/eter ...

  7. 富文本编辑器--获取JSON

    获取 JSON 格式的内容 可以通过editor.txt.getJSON获取 JSON 格式的编辑器的内容,v3.0.14开始支持,示例如下 <div id="div1"&g ...

  8. jQuery效果--隐藏和显示

    jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").click( ...

  9. Spring框架中<mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  10. 记一次启动Tomcat 控制台以及log4j 乱码问题

    Tomcat启动乱码 问题描述:当你发现你的Tomcat启动时乱码了,而你只是换了个Tomcat版本而已. 在找到真正的问题之前,我在网上百度了N多的资料,都试过了,但是都不行.1.修改了 windo ...