Android 飞机大战详解与感悟

本文详细介绍了Android平台上的飞机大战游戏开发过程,包括整体思路、主要使用的技术和类,如SurfaceView、Canvas和Bitmap。作者规划了游戏的各个组成部分,如Start类、游戏界面的多个类,并阐述了如何绘制背景、飞机、子弹、碰撞检测和音效添加。此外,作者还分享了在项目中学习到的封装、继承、多态和方法重载等概念,以及开发过程中的收获和感悟,强调了自我学习和解决问题的重要性。
摘要由CSDN通过智能技术生成

一.飞机大战的整体思路:

飞机大战的主要使用的方法大纲:

1.概略:

Android的飞机大战用的是SurfaceView()来写,那么首先我们要继承SurfaceView这个类,然后我们还需要用多线程的来运行,那么还要实现Runnable以及SurfaceHolder.CallBack接口。实现多线程就必须要用到run()方法。
由于飞机大战的大部分工作是需要画图片到app里,那么我们又会用到Canvas这个类,这个类是画布类,所有的图片都需要画在Canvas的对象上。
然后,我们需要把图片转换成Bitmap格式。
那么,总结一下:飞机大战使用的最重要的一些类,接口和方法分别是
SurfaceView();Runnable;SurfaceHolder.CallBack;Canvas;Bitmap以及run()方法。

2.规划大概要写的类以及要实现的效果

(1)进入界面的类(Start):

构建一个Start类,这个界面上会有三张图片:背景图,logo图,开始游戏的按钮图。
那么,我们就要定义三张图片的X,Y坐标变量,还有Bitmap变量,这些变量都用private进行修饰,这是用了Java的封装,提高了代码的安全性。
然后,开始游戏按钮需要点击屏幕然后进入游戏界面,这里就用到了onTouchEvent()这个方法,那么我们就需要在SurfaceView的子类里复写这个方法,然后把start类的touchEvent()方法调用过去。

(2)进入游戏界面(需要多个类)

在进入到游戏界面时,我们需要建背景类(Background)我的飞机类(MyPlan)
boss飞机类(BossPlan)子弹类(MyBullet)爆炸类(Boom)
音效类(GameSoundPool) ,一共6个类。
首先,游戏界面的背景需要滚动,那么要在背景类(Background)将图片进行无限的循环
在游戏界面,我们要移动自己的飞机和Boss飞机对战,那么自己飞机就需要可移动,那么同样要在MyPlan类里写一个touchEvent()方法。
boss飞机会进入疯狂模式,那么要在boss飞机类(BossPlan)写一个方法来判断它什么时候进入这个模式以及持续的时间。
子弹发射出去有它的速度和频率,那么在子弹类(MyBullet)里要对这些进行判断。
子弹击中飞机以及飞机撞到飞机会产生爆炸效果,我们需要在MyPlanBossPlan类里分别判断飞机是否被击中或者是否被撞到。
子弹发射会有声音,以及爆炸时的爆炸声,这时我们要在音效类(GameSoundPool)里使用load()方法调用音效,然后再用play()方法播放。在使用音效前要先实例化SoundPool的对象,SoundPool是返回一个int类型的值,那么要先int一个整数来接受它,这些变量的声明都用private修饰

3.分步进行详细操作

(1)如何绘制循环滚动背景图片

当第一张图片的y轴大于屏幕的高度时,说明第一张图片滚动结束了,用第二张图片的y轴减去图片高度,这时第一张图片下一次的y轴就在这。
滚动逻辑代码:

public void logic() {
        y1 += 3;
        y2 += 3;
        if (y1 > MySurfaceView.height) {
            y1 = y2 - bitmap1.getHeight();  //当y轴大于手机屏幕高度,下一张图的y轴减去图片高度,第一张图片下一次的y轴就在这
        }
        if (y2 > MySurfaceView.height) {
            y2 = y1 - bitmap1.getHeight();
        }
    }
(2)如何绘制飞机

绘制飞机的图片用Canvas的对象调用draw()方法就行了,由于飞机需要根据手指移动,那么就要判断当手指的坐标在飞机内移动,飞机才会跟随移动,否则飞机不动。
触摸事件就要用toTouchEveny()方法来写,boss飞机有疯狂模式,要定义一个计数器来判断它进入疯狂模式的时间
触摸事件逻辑代码:

   public void touchEvent(MotionEvent event) {      //移动飞机
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            float ex = event.getX();//手指触摸的坐标
            float ey = event.getY();
            if (ex > x && ex < x + width && ey > y && ey < y + height) {
                x = (int) ex - width / 2;//起始坐标(0,0)在左上角,移动的话会向反方向,把起始坐标调整到它中间
                y = (int) ey - height / 2;
                if (y < 0) {
                    y = 0;
                }
                if (y > MySurfaceView.height - height) {
                    y = MySurfaceView.height - height;
                }
                if (x < 0) {
                    x = 0;
                }
                if (x > MySurfaceView.width - width) {
                    x = MySurfaceView.width - width;
                }
            }
        }
    }

判断boss飞机是否进入疯狂模式代码

private int count;             //疯狂模式计数器
private int crazySpeed = 45;   //疯狂模式速读
private int time = 200;        //疯狂模式时间  
private boolean isCrazy;       //是否进入疯狂模式

public void logic(){
          count++;
          if(isCrazy){                        //判断boss飞机是否进入疯狂模式
               y = y+crazySpeed;
               crazySpeed--;
               if(y==0){
                   isCrazy = false;
                   crazySpeed = 50;
               }
          }else{
              if(count%time=&
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值