项目目录

  • 一、项目概述
  • 二、开发环境
  • 三、详细设计
  • 四、运行演示
  • 六、源码获取

一、项目概述

通过自定义View实现Android飞机大战小游戏,游戏玩法很简单,可以锻炼玩家的反应能力。开启背景音乐进行新的游戏,控制飞机移动来消灭敌机获取更多的分数,在移动过程中避免与敌机发生碰撞。主界面可以查看自己的历史战绩和游戏规则,详细规则如下:

  1. 飞机一直发射子弹,用手指滑动可以改变飞机的位置2. 不同的敌机抗击打能力不同,当敌机被击中一定子弹数量时会爆炸,爆炸有动画效果3. 每隔一段时间都会有双发子弹或炸弹等道具奖励4. 获得双发子弹之后,子弹变为双发5. 获得炸弹道具之后,可以通过双击将屏幕内的所有敌机炸毁

二、开发环境

三、详细设计

我们定义了Sprite类,即精灵类,游戏中的飞机、子弹、奖励道具等都是继承自该类,我们通过moveTo()move()等方法控制精灵的位置,通过beforeDraw()onDraw()afterDraw()实现相应的绘图逻辑。精灵类及其子类继承如下所示:

GameView是我们自定义的View类,主要重写了onDraw()onTouchEvent()方法。drawGameStarted(Canvas canvas)绘制运行状态的游戏,drawGamePaused(Canvas canvas)绘制暂停状态的游戏,drawGameOver(Canvas canvas)绘制结束状态的游戏,drawScoreAndBombs(Canvas canvas)绘制左上角的得分和左下角炸弹的数量,removeDestroyedSprites()移除销毁的精灵。

@Override
protected void onDraw(Canvas canvas) {//我们在每一帧都检测是否满足延迟触发单击事件的条件if(isSingleClick()){onSingleClick(touchX, touchY);}super.onDraw(canvas);if(status == STATUS_GAME_STARTED){drawGameStarted(canvas);}else if(status == STATUS_GAME_PAUSED){drawGamePaused(canvas);}else if(status == STATUS_GAME_OVER){drawGameOver(canvas);}
}
  • 在某一时刻GameView有三种状态:游戏开始STATUS_GAME_STARTED、游戏暂停STATUS_GAME_PAUSED和游戏结束STATUS_GAME_OVER。在不同的状态下我们会调用不同的绘制方法,这几个方法中都会调用方法postInvalidate(),这样驱动着View不断重绘,进而不断调用onDraw()方法实现游戏的动态效果。

  • 我们也重写了GameView的onTouchEvent()方法。由于View只支持单击事件,而不支持双击事件,所以我们自己定义了一个resolveTouchType()方法,通过这个方法可以合成我们自己想要的事件类型,比如双击事件。我们记录MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP的时间,一次单击事件由ACTION_DOWN和ACTION_UP两个事件合成,假设从ACTION_DOWN到ACTION_UP间隔小于200毫秒,我们就认为发生了一次单击事件。一次双击事件由两个点击事件合成,两个单击事件之间小于300毫秒,我们就认为发生了一次双击事件。在触发了双击事件的时候,我们就会触发炸弹,将屏幕内的敌机都炸毁。当处于ACTION_MOVE状态时,我们就通过event.getX()event.getY()改变战斗机的位置。

  • 我们还为GameView提供了start()、pause()、resume()和destroy()等方法,使其具备类似于Activity的生命周期,方便在Activity中对GameView进行状态管理。

  • 小敌机类,体积小,抗打击能力低;中敌机类,体积中等,抗打击能力中等;大敌机类,体积大,抗打击能力强。当敌机销毁的时候,我们使用了爆炸效果,爆炸从开始到结束一共14个阶段,我们用两帧绘制爆炸的一个阶段,这样完整绘制一个爆炸效果需要28帧,在绘制完最后一个阶段之后,Explosion类会销毁自己。


在GameActivity中定义Handler对象,一旦接收到what为66的message,立刻获取当前Date对象,设置时间格式,获取message传的score值,调用数据库add()方法插入表中,作为历史成绩。Handler消息机制在自定义View和Activity中进行传值,要比实现接口更加方便。数据库名为plane.db,只有一张表Grade存储历史成绩,add()方法是添加分数,getGrade()获取表中所有分数的列表。

    public static Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 66) {Date date = new Date();SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String score = msg.getData().getString("score");if (dataBaseHelper != null) {dataBaseHelper.add(ft.format(date), score);}}}};

四、运行演示

Android Studio实现飞机大战

六、源码获取

关注公众号《萌新加油站》,后台回复:飞机大战

点此直接下载源码:

Android Studio实现飞机大战相关推荐

  1. android项目飞机大战,Android 项目之飞机大战

    首先,我们要创建一个GameSurface()类:我们此次采用的是画登入界面的方式,所以GameSurface()需要继承SurfaceView类而且要执行SurfaceHolder.Callback ...

  2. Android stutio实现飞机大战

    一.飞机大战整体思路 1.选定背景,然后设置背景,实现两张背景的循环,达成背景的循环滚动的效果 2.加上一个玩家飞机,给他赋予初始位置,然后给玩家飞机Touch,实现玩家飞机能按照手指的触摸位置来进行 ...

  3. Eclipse开发Android平台的飞机大战游戏APP

    目 录 摘 要 I 一. 绪论 1 (一) 课题的目的与意义 1 (二) 本课题解决的问题 1 1. 欢迎界面 1 2. 帮助界面 1 3. 游戏界面 1 4. 失败界面 2 5. 胜利界面 2 6. ...

  4. android studio写坦克大战代码_GitHub 项目推荐:俄罗斯小游戏、Markdown 幻灯片、头像生成器、Logo 制作、坦克大战...

    今天跟大家分享一下,过去几天在各大社交平台分享的一些开源项目. 本周新增了粉丝推荐环节,如果你有发现优质的开源项目,欢迎在公众号或其它平台私信推荐,我们会不定期筛选推送. 小编推荐 俄罗斯方块小游戏 ...

  5. c++课程设计:飞机大战(图形化界面)

    飞机大战.cpp #include <iostream> #include <graphics.h> #include <time.h> #include < ...

  6. Android studio飞机大战游戏分析-月末总结

    整体实现思路 绘制循环滚动的背景图片创建BackGround类 绘制飞机和子弹.创建Myplane和Bullet类 在Myplane中构造isCollision绘制飞机与boss飞机的碰撞,飞机与子弹 ...

  7. Android Studio 飞机大战

    1.整体实现思路 实现飞机大战的简单思路: ①要先建MySurfaceView这个类,在这个类中绘制画布,有画布的高度和宽度,还有画笔,然后在这个建好的画布上开始继续"作画"画布利 ...

  8. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)...

    序言 作为一个android开发人员,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的. 体验地址:http://www.wandoujia ...

  9. Android游戏之仿 微信飞机大战

    暑假实训的一个程序,也是我第一次接触java和android开发,模仿微信的飞机大战,效果图如下:                 一:素材整理 素材来自网络,下载地址在此:http://downlo ...

最新文章

  1. 09JavaScript中的作用域
  2. vscode使用markdown语言编写文本
  3. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...
  4. shell中if 变量里包含字符串的判断
  5. 设计模式C++实现(6)——建造者模式
  6. PHP API接口签名验证
  7. APP时间界面设计模板,可临摹学习的好素材
  8. linux lvm 删除pv磁盘,如何安全的删除Linux LVM中的PV物理卷(硬盘或分区)
  9. 为什么有的人手机通知栏显示的是4G+而有的是HD?
  10. jQuery first()和last()函数示例
  11. laravel 递归 无限层级分类
  12. 人工智能:禁忌搜索算法概述
  13. windows server 2012 重启后进入dos cmd
  14. 儒略日转公历 以及 公历转儒略日(python版)
  15. mysql 5.7 windows 安装步骤
  16. Women in Tech | 关于职业与成长,她们给人奋进的启发和动力
  17. intellij idea 2016 注册码
  18. SSD报错:The shape of the mask [32, 8732] at index 0does not match the shape of the indexed tenso
  19. 第十四届浙江财经大学程序设计竞赛 A A Sad Story【贪心】
  20. 第一范式、第二范式和第三范式

热门文章

  1. 谷歌“猜画小歌”被吐槽:这AI怕是个傻子吧
  2. tcga数据下载_手把手帮你分析这些TCGA甲基化内容
  3. linuxOPS基础_vmware虚拟机安装及介绍
  4. 简单网络嗅探器编写--------java
  5. Android-fastboot刷机
  6. C语言中的 outtextxy(x5, y5,s);的问题
  7. 织梦DedeCMS本地后台运行速度慢完美解决方案
  8. html的下拉列表框
  9. 基于java出租车计价器设计与实现(论文+源码)
  10. Android--使用手机GPS获取经纬度