飞机大战案例分析.doc

上传人:scccc 文档编号:11262372 上传时间:2021-07-20 格式:DOC 页数:26 大小:390.30KB
返回 下载 相关 举报
飞机大战案例分析.doc_第1页
第1页 / 共26页
飞机大战案例分析.doc_第2页
第2页 / 共26页
飞机大战案例分析.doc_第3页
第3页 / 共26页
飞机大战案例分析.doc_第4页
第4页 / 共26页
飞机大战案例分析.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《飞机大战案例分析.doc》由会员分享,可在线阅读,更多相关《飞机大战案例分析.doc(26页珍藏版)》请在三一文库上搜索。

1、简单的微信飞机大战 编写成员:张宏 万熊波 缪伟 专业:11软件工程 姓名:张宏 学号:2011103368 姓名:万熊波 学号:2011103365 姓名:缪伟 学号:2011103388 摘要相信Android(安卓)已经为人们熟知,经过2011年的洗礼,Android智能手机火速上位,甚至说现在手机系统由IOS和Android平分也不为过。随着Android智能手机在中国内地的风靡,基于Android平台的应用开发也逐渐成为IT开发的一大热门。游戏是智能机不可或缺的应用之一,“水果忍者”、“愤怒的小鸟”等Android游戏应用的成功,让人看到手机游戏在Android平台上的巨大发展空间。

2、基于此,采用Eclipse和Android ADT作为集成开发平台,开发本Android游戏APP。本应用为Android飞机大战游戏,主要有6个操作界面分别为开始界面,游戏界面,设置界面,得分界面,Win界面,Lose界面。玩家可以选择自己进入设置界面对游戏进行设置,或进入的分界面查看自己本次操作是否在前六名等操作。作为游戏背景音乐的存在是不可或缺的,本应用在不同的操作界面演奏不同的背景音乐,玩家还可以在设置界面设置背景音乐的大小。由于Android控件Activity的生命周期的特点,本应用会在被点击“EXIT”按钮的Activity中发送一个EXIT的广播,所有的本应用的Activity

3、收到广播后会自动结束,使得本应用能够完全的退出系统。本应用采用Android的SurfaceView绘制游戏界面,游戏的主界面美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。目 录第1章 绪论11.1 系统开发背景11.2 系统研究目的和意义11.3 可行性分析1第2章 系统需求分析22.1 用户功能需求分析22.2 系统性能要求32.3 业务流程分析3第3章 系统总体设计43.1 系统功能模块分析43.1.1系统管理43.1.2 APP应用设置43.1.3 玩家信息管理43.2 系统类关系图43.3 系统总体设计6第4章 系统详细设计8

4、4.1 开发工具简介84.3 游戏界面设计124.3.1开始界面124.3.2游戏界面194.3.3设置界面264.3.4 得分界面34第5章 工作总结和展望53参考文献54致 谢55第1章 绪论1.1 系统开发背景 随着科技的发展,现在手机的功能已不仅仅是简单的接打电话、收发短信了。更多的手机用户希望在工作、学习之余通过方便灵巧可随身携带的仪器休闲娱乐。因此,为了迎合众多用户的需求并适应现在手机的规模,我们开发出一套适合各阶层人士的具有很强的娱乐性和交互性的飞机小游戏。虽然现在市面上存在着各种各样的游戏版本,可是飞机游戏其市场还是相当大的。因为它的特殊在于人们在玩游戏的时候的过程中使爱不释手

5、。随着游戏关卡不断提高,其难度也更大,刺激性也更强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行。对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的。这样的小游戏刚好迎合了他们的需求。1.2 系统研究目的和意义在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,从繁重的日常生活中解脱出来。游戏的主界面应该力求美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。1.3 可行性分析该系统采用Ecl

6、ipse集成Android ADT为开发平台进行APP开发。Eclipse是一个开放的源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。虽然大都数用户很乐于Eclipse当作Java集成开发环境(IDE)来使用,但Eclipse的目标却不仅限于此。Eclipse还包括插件开发环境,这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而

7、言,所有工具开发人员都具有同等的发挥场所。基于Eclipse的应用程序的插件开发诸如Siemens公司的PLM产品Teamcenter的插件级开发。Android专门针对Eclipse开发做了ADT(Android Developer Tools)开发插件,因此该应用使用Eclipse开发完全可行。 第2章 系统需求分析2.1 用户功能需求分析由于本程序简单易操作,交互性好,对用户没什么特别要求。一般用户经过几分钟练系都可以熟悉本游戏的规则。2.2 系统性能要求1.实时性本应用为手机游戏因此对于用户的操作必须做出立即响应,否则本游戏即为失败。2.易操作性单机手机游戏的最大特点即为易操作性,用户

8、在不看说明的情况下也能够玩,并且在玩过几遍之后即熟悉本游戏的规则。这是本应用对于操作性的要求。2.3 业务流程分析依据系统的需求分析,得到系统的流程图如图2-3所示:图2-3 系统流程图 第3章 系统总体设计3.1 系统功能模块分析当前应用使用的SurfaceView来绘制的页面因此相对来说大部分逻辑都是由Activity来做处理的。本系统的功能模块也根据Activity的不同来划分成6个功能模块。3.1.1系统管理 各个操作界面布局适当,颜色搭配等要美观。各个Activity之间的切换要快速(PS:它们各自的背景音乐也要随之切换,给用户以顺畅、自然的感觉)。用户在任何一个Activity点击

9、“EXIT”按钮或ContextMenu中的“退出”都要成功的将当前应用挂起的多个Acitivity和当前Android虚拟机显示的Activity顺利的停止,并销毁3.1.2 APP应用设置设置应用系统背景音乐声音大小和游戏难度。使用SeekBar来控制系统音量,使用RadioGroup来控制飞机难度。3.1.3 玩家信息管理在游戏结束时对于玩家的名称和得分进行记录,并在玩家查看排名情况时,以倒序形式显示前六名玩家的得分和姓名等信息。3.2 系统类关系图系统实体类、边界类、控制类之间的关系如图3-1所示图3-1 实体类、控制类、边界类之间的关系 各个界面类之间的关系如图3-2所示3.3 系统

10、总体设计系统的中只有玩家一种用户,不必向其他的网站或者是教务系统一样进行身份验证等操作。玩家点击应用图标直接进入应用的开始界面。用户的操作总体可以归并成如3-3玩家用例图所显示的内容,子弹的用例图如图3-4所示,飞机的用例图如图3-5所示。用户的操作基本可以划分为“加载游戏”,“开始游戏”,“设置游戏”,“玩游戏”,“查看分数”这五个用例。 玩家用案例图子弹用例图飞机用例图第4章 系统详细设计4.1 开发工具简介Android开发工具(ADT)是一个插件的Eclipse IDE,目的是给开发人员提供一个强大的、集成的环境中构建Android应用程序。扩展能力的Eclipse ADT让你迅速建立

11、新的Android项目,创建一个应用程序的用户界面,添加基于安卓框架的API,调试您的应用程序使用Android SDK工具,生成apk文件在使用Eclipse运行Android应用的时候Eclipse会自动的将生成的apk文件自动的注册到Android虚拟机中。在Eclipse ADT发展与高度推荐,是一种最快的方式开始。与引导项目设置它提供,以及工具集成、定制XML编辑器和调试输出窗格,ADT给了你极大的提高在发展中Android应用程序。使用Eclipse集成Android ADT做Android应用开发是目前企业中常用的Android应用开发方式。本项目在开发环境:l JDK 1.7

12、Eclipse 3.7.4,2 详细分析请看后面的代码第6章 工作总结和展望本应用以Eclipse集成Android ADT为开发环境,在DalvikVM中对自己编写的应用进行测试。当时在编写这个应用的时候遇到过很多的问题,有技术性的问题,有性能性的问题,各种常见的异常,空指针,数组越界等问题。当时在做这个项目时最大的压力是时间,在对Android不是非常熟悉的情况下,培训机构仅仅给了我们十几天的时间让我们做出一个完善的Android应用。记得在刚下需求的时候,前两天一直都在研究需求,分析哪个功能点可以使用什么技术,哪个地方使用某种算法相对来说效率更高。记得有一次被卡在了activity之间的

13、跳转上,由于是在SurfaceView中跳转到另一个Activity的,一时间对于如何在当前SurfaceView中获得它所在的Activity的引用感到不知所措,最后经历了两天的摸索,终于攻克了这一难点。经过自己认真研究攻克的技术点,总是会给人以很大的信心继续走下去,它所带来的那种成就感是难以用语言名状的。经过十多天的开发自己完成了一个相对比较完整的Android应用,这对于之前一直想要从事开发的我来说真的是很大的一次激励。在这个项目之后,感觉自己在实习公司这种真实的开发环境下也很少能够体验到可以与该项目压力相当的需求了。这个项目是我个人编程经历的一个节点,也是从这个项目之后,我正式进入公司

14、实习真正的进入了IT这个行业。而这个项目所带给我的开发上的经验就是:无论当前的项目有多难,需求有多么复杂,时间有多么紧迫,一定要分析透需求,之后一点一点的按照常规的开发进行下去,遇到技术难点不要跳过,解决掉这个再进行下一步的开发,否则,问题越积越多你会对自己失去信心。对于未来,希望自己做一个技术比较过硬的IT编程人员,能够将设计模式融会贯通到自己的代码中,希望自己能够有一个让人一看就一目了然的编程风格。虽然有些碎碎念,但终归是开发过程中的一些真实的经历。值得自己铭记具体代码如下:StartFrame.javaimport java.awt.Graphics;import java.awt.ev

15、ent.MouseEvent;import java.awt.event.MouseListener;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;import com.tarena.LocationUtil;/* * StartFrame类主要是打飞机开始加载页面 * 关取得当前页面的坐标值传入新的页面中 */public class StartFrame extends JFrameint x;int y;public StartFrame()/窗体打开的位置,宽和高this

16、.setBounds(200, 0, 400, 654);/禁止标题栏显示this.setUndecorated(true);/设置窗体的图标this.setIconImage(new ImageIcon(images/icon.jpg).getImage();/创建自定义面板并实例化StartPanel panel = new StartPanel();/窗体移动LocationUtil util = new LocationUtil(this);/当面板添加到当前窗体 this.add(panel); /窗体显示this.setVisible(true);/启动多线程new Thread(

17、panel).start(); public static void main(String args) StartFrame t = new StartFrame(); /自定义面板,实现多线程接口和鼠标事件class StartPanel extends JPanel implements Runnable,MouseListener/定义一个开始加载飞机的坐标int x= -57;int y = 400;public StartPanel()this.addMouseListener(this);Overridepublic void paint(Graphics g) super.pa

18、int(g);/画背景图g.drawImage(new ImageIcon(images/startback.png).getImage(),0,0,this);/画加载时的飞机g.drawImage(new ImageIcon(images/start_aircraft.png).getImage(),x,y,this);/关闭图片g.drawImage(new ImageIcon(images/close.png).getImage(),360,3,this);/最小化图片g.drawImage(new ImageIcon(images/min.png).getImage(),325,3,

19、this); /多线程run()方法Overridepublic void run() /开始加载时的飞机循环画 while(x=360 & e.getX()=3 & e.getY()=325 & e.getX()=3 & e.getY()=34)StartFrame.this.setState(JFrame.ICONIFIED);Overridepublic void mouseEntered(MouseEvent e) / TODO Auto-generated method stubOverridepublic void mouseExited(MouseEvent e) / TODO

20、Auto-generated method stubOverridepublic void mousePressed(MouseEvent e) / TODO Auto-generated method stubOverridepublic void mouseReleased(MouseEvent e) / TODO Auto-generated method stubPlaneMoveThread.java/* * * 加载窗口飞机移动 * */public class PlaneMoveThread extends ThreadEnemyPlane plane;public PlaneM

21、oveThread(EnemyPlane plane)this.plane = plane;public void run() /如果敌机不truewhile(plane.isLive)try plane.move();Thread.sleep(20); catch (InterruptedException e) e.printStackTrace();PlaneFrame.javaimport javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabe

22、l;import com.tarena.LocationUtil;/* * * 游戏主窗口 * */public class PlaneFrame extends JFrame implements Runnable GamePlane plane; /定义一个游戏面板int move_size = 10;/ 敌机移动速度ImageIcon icon = new ImageIcon3; JButton close,min; /关闭和最小化按钮PlaneFrame(int x,int y) /打开位置及宽和高this.setBounds(x, y, 400, 654);/窗体无标题this.se

23、tUndecorated(true);/设置图标this.setIconImage(new ImageIcon(images/icon.jpg).getImage();/例化面板plane = new GamePlane(this);/面板的位置plane.setBounds(0, 0, 400, 654);/将当前的面板添加到当前窗体this.add(plane);/窗体显示this.setVisible(true);/窗体移动LocationUtil util = new LocationUtil(this);/加载敌机for (int i = 0; i icon.length; i+)

24、iconi = new ImageIcon(images/shoot + i + _0.png);/添加面板的鼠标监听plane.addMouseMotionListener(plane);plane.addMouseListener(plane);/起动面板多线程new Thread(plane).start();/起动当前类的多线程new Thread(this).start(); /run()方法中加载敌机Overridepublic void run() while (true) /如果敌没有被打掉if(plane.heroLive) move_size = 5;int ex = (i

25、nt) (Math.random() * (plane.getWidth() - 49);/创建敌机类对象,并实例化EnemyPlane enemy = new EnemyPlane(ex, 0, plane, move_size);/通过随机数产生敌机的分类int pNum=(int)(Math.random()*2);/传入敌机分类enemy.icon = iconpNum;/将敌机加入面板plane.enemys.addElement(enemy);/敌机传入并启动多线程new PlaneMoveThread(enemy).start();/休眠时间try Thread.sleep(50

26、0); catch (InterruptedException e) e.printStackTrace();LocationUtil.javaimport java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import javax.swing.JFrame;public class LocationUtil /创建一个JFrame对象用于接收获取的JFrameJFrame fram;/用于存鼠标坐标private int xx, yy;/用

27、于标识鼠标是否压下private boolean isDraging = false; public LocationUtil(JFrame frame) /将形参值赋给成员变量this.fram = frame;/使用匿名内部类为鼠标添加按钮事件监听fram.addMouseListener(new MouseAdapter() /鼠标按键压下public void mousePressed(MouseEvent e) isDraging = true;xx = e.getX();yy = e.getY();/鼠标按键抬起public void mouseReleased(MouseEven

28、t e) isDraging = false;);/使用匿名内部类为鼠标添加托动事件监听fram.addMouseMotionListener(new MouseMotionAdapter() /鼠标托动方法public void mouseDragged(MouseEvent e) if (isDraging) int left =fram.getLocation().x;int top = fram.getLocation().y;fram.setLocation(left + e.getX() - xx, top + e.getY() - yy););GamePlane.javapack

29、age com.tarena;import java.awt.Font;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.util.Vector;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JPanel;/* * * 游戏面板 * */public

30、class GamePlane extends JPanel implements Runnable, MouseMotionListener,MouseListener private int xx, yy;/ 鼠标压下的位置JFrame frame;int score = 0;/ 积分boolean heroLive = true;/ 定义英雄机为true;private boolean isDraging = false; / 鼠标是否压下Vector bullets = new Vector();/ 子弹数组Vector enemys = new Vector();/ 敌机数组Vect

31、or bombs = new Vector();/ 爆炸数组/ 英雄机的坐标int hero_x = 200;int hero_y = 500;public GamePlane(JFrame frame) this.frame = frame;public void paint(Graphics g) super.paint(g);/ 画背景图g.drawImage(new ImageIcon(images/backmain.png).getImage(), 0,0, this);g.drawImage(new ImageIcon(images/close.png).getImage(), 3

32、60, 3,this);g.drawImage(new ImageIcon(images/min.png).getImage(), 325, 3,this);/ 如果英雄机为trueif (heroLive) g.drawImage(new ImageIcon(images/hero.png).getImage(),hero_x, hero_y, this);/ 画子弹for (int i = 0; i bullets.size(); i+) Bullet b = bullets.get(i);g.drawImage(new ImageIcon(images/bullet.png).getIm

33、age(),b.x, b.y, this);/ 画敌机for (int i = 0; i enemys.size(); i+) EnemyPlane p = enemys.get(i);g.drawImage(p.icon.getImage(), p.x, p.y, this);/ 画敌机for (int i = 0; i bombs.size(); i+) Bomb bomb = bombs.get(i);g.drawImage(new ImageIcon(images/bomb.png).getImage(),bomb.x, bomb.y, this);/ 如果英雄机heroLive的值为

34、false;if (!heroLive) / 画英雄机销毁图片g.drawImage(new ImageIcon(images/hero_destory.png).getImage(),hero_x, hero_y, this);/ 循环将敌机标识为false清除for (int i = 0; i enemys.size(); i+) enemys.get(i).isLive = false;/ 将敌机数组清空enemys.clear();/ 设置字体g.setFont(new Font(微软雅黑, Font.BOLD, 20);/ 画提示信息g.drawString(分数: + score

35、+ 单击鼠标继续, 100, 350);/ 炮弹移动public void bbmove() Bullet bullet = new Bullet(hero_x + 45, hero_y - 14, this);bullets.addElement(bullet);new BulletMoveThread(bullet).start();Overridepublic void run() while (true) / 如果英雄机标识为trueif (heroLive) / 炮弹移动bbmove();/ 休眠时间try Thread.sleep(100);baozha(); catch (Int

36、erruptedException e) e.printStackTrace(); /定义一个方法用于处理爆炸效果public void baozha() / 处理爆炸for (int i = 0; i bombs.size(); i+) Bomb bomb = bombs.elementAt(i);if (bomb.isLive) bomb.graw(); else bombs.remove(i); /鼠标托动Overridepublic void mouseDragged(MouseEvent e) if (isDraging) int left = frame.getLocation()

37、.x;int top = frame.getLocation().y;frame.setLocation(left + e.getX() - xx, top + e.getY() - yy); /鼠标移动Overridepublic void mouseMoved(MouseEvent e) if (heroLive) hero_x = e.getX() - 111 / 2;hero_y = e.getY() - 120 / 2;if (e.getX() = 111 / 2) hero_x = 5;if (e.getY() = this.getWidth() - 100) hero_x = t

38、his.getWidth() - 100;if (hero_y = this.getHeight() - 120) hero_y = this.getHeight() - 120;repaint(); /鼠标单击Overridepublic void mouseClicked(MouseEvent e) if (e.getX() = 360 & e.getX() = 3& e.getY() = 325 & e.getX() = 3& e.getY() = 34) frame.setState(JFrame.ICONIFIED);if (!heroLive) heroLive = true;score = 0;Overridepublic void mouseEntered(MouseEvent e) / TODO Auto-generated method stubOverridepublic void mouseExited(MouseEvent e) /鼠标压下Overridepublic vo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1