点击进行安装下载:https://www.pgyer.com/gUk0
快来玩一下
MainActivity
package com.example.administrator.aircraftwar;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Process;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.Window;
public class MainActivity extends AppCompatActivity {
private GameView mGameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mGameView = new GameView(this);
// gameView.setWindow(getWindowManager());
setContentView(mGameView);
// SurfaceView 看电影 相机绘画
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
mGameView.stop();
AlertDialog.Builder alert=new AlertDialog.Builder(this);
alert.setTitle("你要退出么");
alert.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Process.killProcess(Process.myPid());
}
});
alert.setPositiveButton("继续", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mGameView.start();
}
});
alert.create().show();
}
return false;
}
}
GameView.java
package com.example.administrator.aircraftwar;
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.media.AudioManager;
import android.media.SoundPool;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//飞机绘制
public class GameView extends SurfaceView implements Runnable,
SurfaceHolder.Callback {
//实现监听SurfaceView的变化,实现Runnable的子线程,SurfaceView绘画可以在子线程实现
private Bitmap my;//自己
private Bitmap baozha;//爆炸
private Bitmap bg;//背景
private Bitmap diren;//敌人
private Bitmap zidan;//子弹
private Bitmap erjihuancun;//二级缓存
private WindowManager mWindow;
private int Display_w;//屏幕的宽高
private int Display_h;
private ArrayList mGameImages = new ArrayList<>();
private ArrayList mZidans = new ArrayList<>();
public GameView(Context context) {
super(context);
getHolder().addCallback(this);//注册回掉方法
}
private FeijiImage SelectmFeiji;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {//手接触飞机
for (GameImage game : mGameImages) {
if (game instanceof FeijiImage) {
//是否选中飞机
FeijiImage mFeiji = (FeijiImage) game;
if (game.getX() < event.getX() //判断我点击的X是否小于图的X
&& game.getY() < event.getY()
&& mFeiji.getX() + mFeiji.getW() > event.getX()
&& mFeiji.getY() + mFeiji.getH() > event.getY()) {
//选中了飞机
SelectmFeiji = mFeiji;
} else {
Log.e("xx", "onTouchEvent: 没有");
SelectmFeiji = null;
}
break;
}
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (SelectmFeiji != null) {
SelectmFeiji.setX((int) event.getX() - SelectmFeiji.getW() / 2);
SelectmFeiji.setY((int) event.getY() - SelectmFeiji.getH() / 2);
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
SelectmFeiji = null;
}
return true;
}
private SoundPool poll=null;
int bomb;
int gameover;
int shot;
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);
mGameImages.add(new BeijingImage(bg));//先加入背景照片
mGameImages.add(new FeijiImage(my));//自己
mGameImages.add(new DijiImage(diren,baozha));//敌人
poll=new SoundPool(10, AudioManager.STREAM_SYSTEM,0);
bomb = poll.load(getContext(), R.raw.bomb, 1);
gameover = poll.load(getContext(), R.raw.gameover, 1);
shot = poll.load(getContext(), R.raw.shot, 1);
}
private class Bofang extends Thread{
int i;
public Bofang(int i){
this.i=i;
}
@Override
public void run() {
poll.play(i,1,1,1,0,1);
super.run();
}
}
private interface GameImage {
Bitmap getBitmap();
int getX();
int getY();
}
//负责背景照片的处理
private class BeijingImage implements GameImage {
Bitmap bg;
private Bitmap newBitmap = null;
private BeijingImage(Bitmap bg) {
this.bg = bg;
newBitmap = Bitmap.createBitmap(Display_w, Display_h, Bitmap.Config.ARGB_8888);
}
private int heigth = 0;
@Override
public Bitmap getBitmap() {
Paint paint = new Paint();
Canvas canvas = new Canvas(newBitmap);
/**
* 将源资源对应的尺寸 绘制 到目标资源对应的尺寸上
* @param bitmap 源资源
* @param src 源资源的尺寸
* @param dst 目标资源的尺寸
* @param paint May be null. The paint used to draw the bitmap
*/
//绘制下面的图片
canvas.drawBitmap(bg, new Rect(0, 0, bg.getWidth(), bg.getHeight()),
new Rect(0, heigth, Display_w, Display_h + heigth), paint);
//绘制上面的图片
canvas.drawBitmap(bg, new Rect(0, 0, bg.getWidth(), bg.getHeight()),
new Rect(0, -Display_h + heigth, Display_w, heigth), paint);
heigth++;
if (heigth == Display_h) {
heigth = 0;
}
return newBitmap;
}
@Override
public int getX() {
return 0;
}
@Override
public int getY() {
return 0;
}
}
//自己飞机
private class FeijiImage implements GameImage {
private Bitmap newBitmap;
private int X;
private int Y;
private int w;
private int h;
public int getW() {
return w;
}
public void setW(int w) {
this.w = w;
}
public int getH() {
return h;
}
public void setH(int h) {
this.h = h;
}
public void setX(int x) {
X = x;
}
public void setY(int y) {
Y = y;
}
// public boolean select(int x,int y){
//
// }
private List feiji = new ArrayList<>();
public FeijiImage(Bitmap my) {
newBitmap = my;
Bitmap bitmap = Bitmap.createBitmap(newBitmap, 0, 0, newBitmap.getWidth() / 4, newBitmap.getHeight());
Bitmap bitmap2 = Bitmap.createBitmap(newBitmap, (newBitmap.getWidth() / 4) * 1, 0, newBitmap.getWidth() / 4, newBitmap.getHeight());
Bitmap bitmap3 = Bitmap.createBitmap(newBitmap, (newBitmap.getWidth() / 4) * 2, 0, newBitmap.getWidth() / 4, newBitmap.getHeight());
Bitmap bitmap4 = Bitmap.createBitmap(newBitmap, (newBitmap.getWidth() / 4) * 3, 0, newBitmap.getWidth() / 4, newBitmap.getHeight());
feiji.add(bitmap);
feiji.add(bitmap2);
feiji.add(bitmap3);
feiji.add(bitmap4);
//得到战机的高和宽
w = newBitmap.getWidth() / 4;
h = newBitmap.getHeight();
X = (Display_w - newBitmap.getWidth() / 4) / 2;
Y = Display_h - newBitmap.getHeight() - 30;
}
private int index = 0;
private int num = 0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = feiji.get(index);
if (num == 10) {
index++;
if (index == feiji.size()) {
index = 0;
}
num = 0;
}
num++;
return bitmap;
}
@Override
public int getX() {
return X;
}
@Override
public int getY() {
return Y;
}
}
//敌人飞机
private class DijiImage implements GameImage {
private Bitmap diren;
private List mBitmaps = new ArrayList<>();
private List baozas = new ArrayList<>();
private int X;
private int Y;
private int W;
private int H;
public DijiImage(Bitmap diren,Bitmap baoza) {
this.diren = diren;
//前23参数是从哪开始,后面是结束的宽高
Bitmap bitmap = Bitmap.createBitmap(diren, 0, 0, diren.getWidth() / 4, diren.getHeight());
Bitmap bitmap1 = Bitmap.createBitmap(diren, (diren.getWidth() / 4) * 1, 0, diren.getWidth() / 4, diren.getHeight());
Bitmap bitmap2 = Bitmap.createBitmap(diren, (diren.getWidth() / 4) * 2, 0, diren.getWidth() / 4, diren.getHeight());
Bitmap bitmap3 = Bitmap.createBitmap(diren, (diren.getWidth() / 4) * 3, 0, diren.getWidth() / 4, diren.getHeight());
mBitmaps.add(bitmap);
mBitmaps.add(bitmap1);
mBitmaps.add(bitmap2);
mBitmaps.add(bitmap3);
baozas.add(Bitmap.createBitmap(baoza,0,0,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*1,0,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*2,0,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*3,0,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,0,baoza.getHeight()/2,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*1,baoza.getHeight()/2,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*2,baoza.getHeight()/2,baoza.getWidth()/4,baoza.getHeight()/2));
baozas.add(Bitmap.createBitmap(baoza,(baoza.getWidth()/4)*3,baoza.getHeight()/2,baoza.getWidth()/4,baoza.getHeight()/2));
Y = -diren.getHeight();
Random ran = new Random();
X = ran.nextInt(Display_w - (diren.getWidth() / 4));
W = diren.getWidth() / 4;
H = diren.getHeight();
}
private int index = 0;
private int num = 0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = mBitmaps.get(index);
//因为index到不了8
// if(index==8&&siwang){
// mGameImages.remove(this);
// }
if (num == 7) {
index++;
if(index==8&&siwang){
mGameImages.remove(this);
}
if (index == mBitmaps.size()) {
index = 0;
}
num = 0;
}
Y += dijiyidong;
num++;
if (Y > Display_h) {
mGameImages.remove(this);
}
return bitmap;
}
@Override
public int getX() {
return X;
}
@Override
public int getY() {
return Y;
}
private boolean siwang=false;
//收到攻击
public void soudaogongji(ArrayList zidans) {
if(!siwang){
for (Zidan zd : (List) zidans.clone()) {
if (zd.getX() > X && zd.getY() > Y && zd.getX() < X + W && zd.getY() < Y + H) {
siwang=true;
zidans.remove(zd);
mBitmaps=baozas;
fenshu+=10;
new Bofang(bomb).start();
break;
}
}
}
}
}
//子弹
private class Zidan implements GameImage {
private FeijiImage feijiImage;
private Bitmap zidan;
private int X;
private int Y;
public Zidan(FeijiImage feijiImage, Bitmap zidan) {
this.feijiImage = feijiImage;
this.zidan = zidan;
X = (feijiImage.getX() + feijiImage.getW() / 2) - 17;
Y = feijiImage.getY() - zidan.getHeight();
}
@Override
public Bitmap getBitmap() {
Y -= 19;
if (Y <= -10) {
mZidans.remove(this);
}
return zidan;
}
@Override
public int getX() {
return X;
}
@Override
public int getY() {
return Y;
}
}
private boolean runState = false;
private SurfaceHolder mHolder = null;
private long fenshu=0;
private int guanka=1;
private int chudishu = 30; // 出敌机的数字
private int dijiyidong = 5; // 敌机移动
private int xiayiguan = 50; // 下一关分数
private int[][] sj = { { 1, 50, 30, 5 }, { 2, 100, 30, 5 },
{ 3, 200, 30, 6 }, { 4, 300, 25, 6 }, { 5, 400, 25, 7 },
{ 6, 500, 25, 7 }, { 7, 600, 20, 8 }, { 8, 700, 20, 8 },
{ 9, 800, 15, 9 }, { 10, 900, 10, 10 }, { 11, 1000, 10, 10 },
{ 12, 1100, 10, 10 } };
//绘画中心
@Override
public void run() {
Paint pain = new Paint();
Paint pain2 = new Paint(Paint.ANTI_ALIAS_FLAG);
pain2.setColor(Color.YELLOW);
pain2.setTextSize(50);
pain2.setDither(true);//设置防震动
int diren_num = 0;
int zidan_num = 0;
try {
while (runState) {
while (stopState) {
try {
Thread.sleep(1000000);
} catch (Exception e) {
}
}
if (SelectmFeiji != null) {
zidan_num++;
if (zidan_num == 10) {
zidan_num = 0;
new Bofang(shot).start();
mZidans.add(new Zidan(SelectmFeiji, zidan));
}
}
Canvas canvas1 = new Canvas(erjihuancun);
for (GameImage image : (List) mGameImages.clone()) {
if(image instanceof DijiImage){
DijiImage diji= (DijiImage)image;
diji.soudaogongji(mZidans);
}
canvas1.drawBitmap(image.getBitmap(), image.getX(), image.getY(), pain);
}
diren_num++;
if (diren_num == chudishu) {
diren_num = 0;
mGameImages.add(new DijiImage(diren,baozha));
}
for (Zidan image : (List) mZidans.clone()) {
canvas1.drawBitmap(image.getBitmap(), image.getX(), image.getY(), pain);
}
//分数
canvas1.drawText("得分"+fenshu+"关卡"+guanka,0,40,pain2);
canvas1.drawText("下一关" + xiayiguan, 0, 100, pain2);
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];
}
//锁上获得绘画的画布\new Rect(0,0,0,0)绘画的范围
Canvas canvas = mHolder.lockCanvas();//锁
canvas.drawBitmap(erjihuancun, 0, 0, pain);
mHolder.unlockCanvasAndPost(canvas);//解锁
}
} catch (Exception E) {
Log.e("gg", "run:异常 ");
}
}
//试图创建时
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
}
private boolean stopState = false;
public void stop() {
stopState = true;
}
public void start() {
stopState = false;
sleepTime.interrupt();// 起来
}
//界面发生改变时
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
Display_w = i1;
Display_h = i2;
init();
mHolder = surfaceHolder;
runState = true;
//初始化
sleepTime=new Thread(this);
sleepTime.start();
}
Thread sleepTime=null;
//销毁的
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
runState = false;
}
}
效果图
image.png