Android studio 飞机大战实训报告

1.游戏分析
飞机大战中的主要“角色”有:
1.玩家飞机
2.敌方飞机
3.玩家飞机发送的子弹
4.敌方Boss飞机发送的子弹
我们需要控制的有:
1.绘制屏幕内的角色
2.控制角色的逻辑,比如:敌方飞机与我方飞机的碰撞检测,我方飞机发射的子弹与敌方飞机之间的碰撞检测,敌方Boss飞机发射的子弹与我方飞机直接的碰撞检测等等。
资源:
要完成一个游戏,还要有资源的加载,比如飞机,子弹等图片的加载等,音效的加载。
游戏背景的绘制

其实是一张图,这张图可以首尾相接,也即是“卷轴”,原理就是卡马克卷轴算法的原理。


2、如何绘制循环滚动的背景图片

在MySurfaceView中创建run方法

调用mipmap中的背景图片 

再创建BackGround类

代码如下:

  1. package com.example.lenovo.myapplication;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Paint;  
  6.   
  7. public class BackGround {  
  8.     private int y1;  
  9.     private  int y2;  
  10.     private Bitmap bitmap;  
  11.     public BackGround(Bitmap bitmap){  
  12.         this.bitmap = bitmap;  
  13.         y1 = 0;  
  14.         y2 = y1-bitmap.getHeight();  
  15.     }  
  16.     public void draw(Canvas canvas){  
  17.   
  18.         logic();  
  19.         Paint paint = new Paint();  
  20.         canvas.drawBitmap(bitmap,0,y1,paint);  
  21.         canvas.drawBitmap(bitmap,0,y2,paint);  
  22.     }  
  23.     public void logic(){  
  24.         y1+=5;  
  25.         y2+=5;  
  26.         if(y1>=MySurfaceView.Height){  
  27.             y1=y2-bitmap.getHeight();  
  28.         }  
  29.         if(y2>=MySurfaceView.Height){  
  30.             y2=y1-bitmap.getHeight();  
  31.         }  
  32.     }  
  33. }  
3、如何绘制飞机
绘制敌机:

  1. package com.example.lenovo.myapplication;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Paint;  
  6.   
  7. import java.util.function.BooleanSupplier;  
  8.   
  9. public class BossPlane {  
  10.     private Bitmap bitmap;  
  11.     private int x,y;  
  12.     private int frameW,frameH;  
  13.   
  14.     public BossPlane(Bitmap bitmap){  
  15.         this.bitmap = bitmap;  
  16.         this.frameW = bitmap.getWidth()/10;  
  17.         this.frameH = bitmap.getHeight();  
  18.         x=MySurfaceView.width/2-frameW/2;  
  19.     }  
  20.   
  21.     public void draw(Canvas canvas, Paint paint){  
  22.         canvas.clipRect(x,y,x+frameW,y+frameH);  
  23.         canvas.drawBitmap(bitmap,x,y,paint);  
  24.     }  
  25. }  

绘制自己的飞机:

[java]  view plain  copy
  1. public class MyPlane {  
  2.     private final Bitmap bitmap;  
  3.     private int y;  
  4.     private int x;  
  5.     private  int width;  
  6.     private int height;  
  7.   
  8.   
  9.   
  10.   
  11.     public MyPlane(Bitmap bitmap) {  
  12.         this.bitmap = bitmap;  
  13.         x = MySurfaceView.width / 2 - bitmap.getWidth() / 2;  
  14.         y  = MySurfaceView.height - bitmap.getHeight();  
  15.         width = bitmap.getWidth();  
  16.         height = bitmap.getHeight();  
  17.     }  
  18.   
  19.     public void draw(Canvas canvas, Paint paint){  
  20.         canvas.drawBitmap(bitmap, x, y, paint);  
  21.     }  
  22.     public  void  touchEvent(MotionEvent event){  
  23.         if (event.getAction()==MotionEvent.ACTION_MOVE){  
  24.             float ex = (int) event.getX();  
  25.             float ey = (int) event.getY();  
  26.   
  27.             if (ex>x&&exy&&ey
  28.                 x = (int) ex-width/2;  
  29.                 y = (int) ey-height/2;  
  30.             }  
  31.         }  
  32.     }  
  33. }  


4.如何绘制子弹

创建个子弹类Bullet

并加入BossBullet创建方法

  1. public static int height;  
  2.     public static int width;  
  3.     private SurfaceHolder surfaceHolder;  
  4.     private Canvas canvas;//绘制图形的画布  
  5.     private boolean isDrawing = true;//标定位  
  6.     private MyPlane plane;  
  7.     private VectorbulletVector = new Vector<>();//玩家子弹数组  
  8.     private VectorbossBullterVector = new Vector<>();//Boss子弹数组  
  9.     private int count;  
  10.   
  11.     public MySurfaceView(Context context) {  
  12.         super(context);  
  13.         init();  
  14.   
  15.     }  
  16.   
  17.     /** 
  18.      * 初始化操作 
  19.      * 
  20.      * @param 
  21.      */  
  22.   
  23.     private void init() {  
  24.         surfaceHolder = getHolder();  
  25.         surfaceHolder.addCallback(this);//添加回调时间监听  
  26.         setFocusable(true);//设置可聚焦  
  27.         setKeepScreenOn(true);//设置屏幕常亮  
  28.         setFocusableInTouchMode(true);//设置接触模式  
  29.         height = getHeight();  
  30.   
  31.     }  
  32.   
  33.     @Override  
  34.     public void surfaceCreated(SurfaceHolder holder) {  
  35.         new Thread(this).start();//启动子线程  
  36.         height = getHeight();  
  37.         width = getWidth();  
  38.   
  39.     }  
  40.   
  41.     @Override  
  42.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  43.   
  44.     }  
  45.   
  46.   
  47.     @Override  
  48.     public void surfaceDestroyed(SurfaceHolder holder) {  
  49.         isDrawing = false;  
  50.     }  
  51.   
  52.     @Override  
  53.     public void run() {  
  54.         Paint paint = new Paint();  
  55.         BackGround backGround = new BackGround(BitmapFactory.decodeResource(getResources(), R.mipmap.bk));  
  56.         plane = new MyPlane(BitmapFactory.decodeResource(getResources(), R.mipmap.myplane));  
  57.         BossPlane bossPlane = new BossPlane(BitmapFactory.decodeResource(getResources(), R.mipmap.bossplane));  
  58.   
  59.         while (isDrawing) {  
  60.             count++;  
  61.             try {  
  62.                 canvas = surfaceHolder.lockCanvas();//锁定画布  
  63.                 canvas.drawColor(Color.WHITE);  
  64.   
  65.                 backGround.draw(canvas, paint);  
  66.                 plane.draw(canvas, paint);  
  67.                 bossPlane.draw(canvas, paint);  
  68.   
  69.   
  70.                 if (count % 20 == 0) {  
  71.                     Bullet bullet = new Bullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), plane.getX, plane.getY,0);  
  72.                     Bullet bullet1 = new Bullet(BitmapFactory.decodeResource(getResources(), R.mipmap.mybullet), plane.getX() + plane.getWidth(), plane.getY,0);  
  73.                     bulletVector.add(bullet);  
  74.                     bulletVector.add(bullet1);  
  75.                 }  
  76.                 //移除消失的子弹  
  77.                 for (int i = 0; i < bulletVector.size(); i++) {  
  78.                     if (bulletVector.elementAt(i).isDead()) {  
  79.                         bulletVector.remove(i);  
  80.                     }  
  81.                 }  
  82.                 //绘制玩家子弹  
  83.                 for (int i = 0; i < bulletVector.size(); i++) {  
  84.                     bulletVector.elementAt(i).draw(canvas, paint);  
  85.                 }  
  86.   
  87.                 if (count % 20 == 0) {  
  88.                     Bullet bullet = new Bullet(BitmapFactory.decodeResource(getResources(), R.mipmap.bossbullet), bossPlane.getX(), bossPlane.getY()+bossPlane.getFramH(),1);  
  89.                     Bullet bullet1 = new Bullet(BitmapFactory.decodeResource(getResources(), R.mipmap.bossbullet), bossPlane.getX() + bossPlane.getFramW(), bossPlane.getY+bossPlane.getFramH(),1);  
  90.                     bossBullterVector.add(bullet);  
  91.                     bossBullterVector.add(bullet1);  
  92.                 }  
  93.                 //移除消失boss的子弹  
  94.                 for (int i = 0; i < bossBullterVector.size(); i++) {  
  95.                     if (bossBullterVector.elementAt(i).isDead()) {  
  96.                         bossBullterVector.remove(i);  
  97.                     }  
  98.                 }  
  99.                 //绘制boss子弹  
  100.                 for (int i = 0; i < bossBullterVector.size(); i++) {  
  101.                     bossBullterVector.elementAt(i).draw(canvas, paint);  
  102.                 }  
  103.   
  104.   
  105.             } catch (Exception e) {  
  106.                 e.printStackTrace();  
  107.             } finally {  
  108.                 if (canvas != null) {  
  109.                     surfaceHolder.unlockCanvasAndPost(canvas);//解锁画布,显示到屏幕上  
  110.                 }  
  111.             }  
  112.   
  113.   
  114.         }  
  115.   
  116.     }  
  117.   

5、如何判断碰撞(子弹与飞机碰撞、飞机与飞机碰撞)

创建Boom类

  1.   public void draw(Canvas canvas, Paint paint){  
  2.         canvas.drawBitmap(bitmap,x,y,paint);  
  3.         logic();  
  4.     }  
  5.   
  6.     public void logic(){  
  7.         switch (type){  
  8.             case 0:  
  9.                 //玩家子弹  
  10.                 y -=speed;  
  11.                 if (y<0){  
  12.                     isDead = true;  
  13.                 }  
  14.                 break;  
  15.             case 1:  
  16.                 //Boss子弹  
  17.                 y += speed+20;  
  18.                 break;  
  19.             default:  
  20.                 break;  
  21.         }  


6.如何添加音效

创建GameSoundPool 类

加入以下代码

 public GameSoundPool(Context context){
        this.soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC,0);
        s1 = soundPool.load(context,R.raw.shoot,1);
        s2 = soundPool.load(context,R.raw.explosion2,1);
        s3 = soundPool.load(context,R.raw.bgm_zhandou2,1);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6



7.哪些地方用到封装,继承,多态,方法重载,接口等

封装

每一个类中的属性基本都用到了封装方法如

public class Bullet {
    private Bitmap bitmap;
    private int x, y;
    private int speed = 10;
    private boolean isDead;
    private int type;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

8.我的收获与感悟:

这一个月的实训课,让我收获了很多,知道了团队合作的重要性,收获了许多知识,

知道了有些困难并没有它看上去那么难,也让我知道了做事情一定要细心,因为

再小的误差也会使程序报错,总之,这个实训月让我完成了一次蜕变。

你可能感兴趣的:(Android studio 飞机大战实训报告)