MainActivity

package com.example.matt.aircraft;import android.os.Bundle;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.util.Log;import android.view.KeyEvent;import android.view.Window;import android.view.WindowManager;import com.example.matt.aircraft.DaFeiJiGameView;import static android.content.ContentValues.TAG;public class MainActivity extends Activity implements DialogInterface.OnClickListener{    DaFeiJiGameView view = null;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //requestWindowFeature(Window.FEATURE_NO_TITLE);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                WindowManager.LayoutParams.FLAG_FULLSCREEN);        view = new DaFeiJiGameView(this);//        view.setwindow(getWindowManager());        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) {            onRestart();        } else {            android.os.Process.killProcess(android.os.Process.myPid());        }    }}

DaFeiJiGameView

package com.example.matt.aircraft;import android.app.AlertDialog;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;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.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.MotionEvent;import android.view.Surface;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;import static android.content.ContentValues.TAG;public class DaFeiJiGameView extends SurfaceView implements SurfaceHolder.Callback, Runnable,        View.OnTouchListener, View.OnClickListener {    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 gameImages = new ArrayList<>();    private ArrayList zidans = new ArrayList<>();    public DaFeiJiGameView(Context context) {        super(context);        getHolder().addCallback(this);        this.setOnTouchListener(this); // 事件注册    }//        // 得到屏幕的宽高//        display_w = ;//        display_h = ;    private SoundPool pool = null;    private int sound_bomb = 0;    private int sound_gameover = 0;    private int sound_shot = 0;    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);        gameImages.add(new BeijingImage(bg)); // 加入背景照片        gameImages.add(new FeijiImage(my)); // 加入飞机照片        gameImages.add(new DijiImage(diren, baozha));        // 加载声音        pool = new SoundPool(3, AudioManager.STREAM_SYSTEM, 5);        sound_bomb = pool.load(getContext(), R.raw.bomb, 1);        sound_gameover = pool.load(getContext(), R.raw.gameover, 1);        sound_shot = pool.load(getContext(), R.raw.shot, 1);    }    @Override    public void onClick(View v) {    }    private class SoundPlay extends Thread {        int i = 0;        public SoundPlay(int i) {            this.i = i;        }        @Override        public void run() {            pool.play(i, 1, 1, 1, 0, 1);        }    }    private interface GameImage {        public Bitmap getBitmap();        public int getX();        public int getY();    }    private class Zidan implements GameImage {        private int x;        private int y;        private Bitmap zidan;        private FeijiImage feiji;        public Zidan(FeijiImage feiji, Bitmap zidan) {            this.feiji = feiji;            this.zidan = zidan;            // 子弹居中            x = feiji.getX() + feiji.getWidth() / 2 - 13;            y = feiji.getY();        }        @Override        public Bitmap getBitmap() {            y -= 10;            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;        private int x;        private int y;        private int width;        private int height;        private List bitmaps = new ArrayList<>();        public List getBaozhas() {            return baozhas;        }        private List baozhas = new ArrayList<>();        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();            // 敌人出现的范围            Random ran = new Random();            x = ran.nextInt(display_w - width);            y = -diren.getHeight();        }        private int index = 0;        private int num = 0;        @Override        public Bitmap getBitmap() {            Bitmap bitmap = bitmaps.get(index);            if (num == 2) {                index++;                if (index == 8 && status) {                    gameImages.remove(this);                }                if (index == bitmaps.size()) {                    index = 0;                }                num = 0;            }            y += 10;            num++;            if (y > display_h) {                gameImages.remove(this);            }            return bitmap;        }        private boolean status = false;//        public void collide(ArrayList dijiImages) {//            for (DijiImage diji : dijiImages) {//                if (diji.getX() >= x && diji.getX() <= x + width && diji.getY() >= y && diji.getY() <= y +height ||//                        x >= diji.getX() && x <= diji.getX() + diji.getWidth() && y >= diji.getY() && y <= diji.getY() + height) {//                    life -= 10;//                }//            }//        }        // 受到攻击        public void shoudaogongji(ArrayList zidans) {            if (!status) {                for (Zidan zidan : (List) zidans.clone()) {                    if (zidan.getX() > x && zidan.getY() > y &&                            zidan.getX() < x + width &&                            zidan.getY() < y + height) {                        zidans.remove(zidan);                        status = true;                        bitmaps = baozhas;                        fenshu += 10;                        new SoundPlay(sound_bomb).start();                        break;//                    Log.i(TAG, "击中");                    }                }            }        }        @Override        public int getX() {            return x;        }        @Override        public int getY() {            return y;        }        public int getWidth() {            return width;        }        public int getHeight() {            return height;        }    }    // 飞机图片    private class FeijiImage implements GameImage {        private Bitmap my;        private int x;        private int y;        private int width;        private int height;        private List bitmaps = new ArrayList<>();        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 * 1, 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;            height = my.getHeight();            x = (display_w - my.getWidth() / 4) / 2;            y = display_h - my.getHeight() - 20;        }        private int index = 0;        private int num = 0;        @Override        public Bitmap getBitmap() {            Bitmap bitmap = bitmaps.get(index);            if (num == 5) {                index++;                if (index == bitmaps.size()) {                    index = 0;                }                num = 0;            }            num++;            if (y > display_h) {                gameImages.remove(this);            }            return bitmap;        }        // 飞机的生命值        private int life = 100;//        public void collide(ArrayList dijiImages) {//            for (DijiImage diji : dijiImages) {//                if ((diji.getX() >= x && diji.getX() <= x + width && diji.getY() >= y && diji.getY() <= y +height) ||//                        (x >= diji.getX() && x <= diji.getX() + diji.getWidth() && y >= diji.getY() && y <= diji.getY() + height)) {//                    setLife(getLife() - 10);////                    Log.d("tag", "发生碰撞");//                }//            }//        }        public void collide(DijiImage diji) {//            Log.d("tag", "碰撞检测");                if (diji.getX() >= x && diji.getX() <= x + width && diji.getY() >= y && diji.getY() <= y +height ||                        x >= diji.getX() && x <= diji.getX() + diji.getWidth() && y >= diji.getY() && y <= diji.getY() + height) {                    if (getLife() <= 0) {                        gameover();                    }                    if (getLife() >= 10)                    setLife(getLife() - 10);                    diji.bitmaps = diji.getBaozhas();                    // TODO 添加爆炸                    gameImages.remove(diji);                    new SoundPlay(sound_bomb).start();//                    Log.d("tag", "发生碰撞");                }        }        @Override        public int getX() {            return x;        }        @Override        public int getY() {            return y;        }        public void setX(int x) {            // 保证飞机不越界            if (x >= 0 && x <= display_w - width) {                this.x = x;            }        }        public void setY(int y) {            if (y >= 0 && y <= display_h - height) {                this.y = y;            }        }        public int getLife() {            return life;        }        public void setLife(int life) {            this.life = life;        }        public int getWidth() {            return width;        }        public int getHeight() {            return height;        }    }    // 背景图片    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;        }        @Override        public int getX() {            return 0;        }        @Override        public int getY() {            return 0;        }    }    private boolean status = false;    private SurfaceHolder holder;    private long fenshu = 0;    private int life;    private boolean stopState = false;    public void stop() {        stopState = true;    }    public void start() {        stopState = false;        thread.interrupt();    }    private boolean over = false;    // 绘画中心    @Override    public void run() {        Paint p1 = new Paint();        Paint p2 = new Paint();        p2.setColor(Color.WHITE);        p2.setTextSize(50);        p2.setDither(true);        p2.setAntiAlias(true);        int diren_num = 0;        int zidan_num = 0;        try {            while (status) {                while (stopState) {                    try {                        Thread.sleep(1000000);                    } catch (Exception e) {                    }                }                // 按住发子弹                if (selectFeiji != null) {                    if (zidan_num == 10) {                        new SoundPlay(sound_shot).start();                        zidans.add(new Zidan(selectFeiji, zidan));                        zidan_num = 0;                    }                    zidan_num++;                }                Canvas newCanvas = new Canvas(erjihuancun);                if (over) {                    p2.setColor(Color.RED);                    p2.setTextSize(200);                    newCanvas.drawText("GAME OVER", 50, 50, p2);                }                // 碰撞检测                for (GameImage image : (List) gameImages.clone()) {                    if (image instanceof FeijiImage) {                        FeijiImage feiji = (FeijiImage) image;                        life = feiji.getLife();//                        Log.d(TAG, "获得飞机");                        for (GameImage image2 : (List) gameImages.clone()) {                            if (image2 instanceof DijiImage) {                                DijiImage diji = (DijiImage)image2;//                                Log.d(TAG, "获得敌机");                                feiji.collide(diji);                            }                        }                    }                }                for (GameImage image : (List) gameImages.clone()) {                    if (image instanceof DijiImage) {                        // 把子弹告诉敌机                        ((DijiImage) image).shoudaogongji(zidans);                    }                    newCanvas.drawBitmap(image.getBitmap(), image.getX(),                            image.getY(), p1);                }                for (Zidan image : (List) zidans.clone()) {                    newCanvas.drawBitmap(image.getBitmap(), image.getX(),                            image.getY(), p1);                }                // 分数                newCanvas.drawText("分数: " + fenshu, 0, 50, p2);                newCanvas.drawText("生命: " + life, 0, 100, p2);                if (diren_num == 10) {                    diren_num = 0;                    gameImages.add(new DijiImage(diren, baozha));                }                diren_num++;                Canvas canvas = holder.lockCanvas();                canvas.drawBitmap(erjihuancun, 0, 0, p1);                holder.unlockCanvasAndPost(canvas);                Thread.sleep(5);            }        } catch (Exception e) {        }    }    private void gameover() {        Log.d(TAG, "游戏结束了!");        over = true;        new SoundPlay(sound_gameover).start();        try {            Thread.sleep(1000000);        } catch (InterruptedException e) {            e.printStackTrace();        }////        // TODO 这里有问题 炸了//        AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());//        dialog.setTitle("游戏结束");//        dialog.setMessage("太差了,继续游戏?");//        dialog.setCancelable(false);//        dialog.setPositiveButton("接着干", new DialogInterface.OnClickListener() {//            @Override//            public void onClick(DialogInterface dialog, int which) {//                new MainActivity();//            }//        });//        dialog.setNegativeButton("不打了", new DialogInterface.OnClickListener() {//            @Override//            public void onClick(DialogInterface dialog, int which) {//                android.os.Process.killProcess(android.os.Process.myPid());//            }//        });//        dialog.create().show();    }    @Override    public void surfaceCreated(SurfaceHolder holder) {    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        display_w = width;        display_h = height;        init();        this.holder = holder;        status = true;        thread = new Thread(this);        thread.start();    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        status = false;    }    Thread thread = null;    FeijiImage selectFeiji;    @Override    public boolean onTouch(View v, MotionEvent event) {        // 手接近屏幕        if (event.getAction() == MotionEvent.ACTION_DOWN) {            // 找到飞机图片            for (GameImage image : gameImages) {                if (image instanceof FeijiImage) {                    FeijiImage feiji = (FeijiImage) image;                    // 手触摸飞机                    if (feiji.getX() < event.getX() && feiji.getY() < event.getY() &&                            feiji.getX() + feiji.getWidth() > event.getX() &&                            feiji.getY() + feiji.getHeight() > 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.getHeight() / 2);            }        } else if (event.getAction() == MotionEvent.ACTION_UP) {            selectFeiji = null;        }        return true;    }}

更多相关文章

  1. android 游戏 实战打飞机游戏 子弹生成与碰撞 以及爆炸效果(5)
  2. android 游戏 实战打飞机游戏 BOSS的设计 以及胜利失败页面
  3. android Region碰撞
  4. android 游戏 实战打飞机游戏 怪物(敌机)类的实现(4)
  5. Android(安卓)在使用SmartRefreshLayout遇到的点点滴滴
  6. android飞机游戏敌机移动路径
  7. android 圆形碰撞
  8. android box2d重力系统 碰撞检查(二)
  9. Android开源项目:微信打飞机游戏源代码

随机推荐

  1. Android中使用socket使底层和framework通
  2. Android(安卓)View体系(一)视图坐标系
  3. Android画图--Matrix
  4. Android(安卓)NDK开发Crash错误定位
  5. 基于Android10的Activity的启动流程简析
  6. 将app变为桌面程序,开机后不再显示原桌面,
  7. 寒冬已至?四面楚歌的 Android(安卓)工程师
  8. Path相关方法讲解(二)
  9. Android中Serializable和Parcelable接口
  10. Android(安卓)模拟器 安装apk 注意事项