为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于Android操作系统的足球小将手机游戏毕业论文

2018-03-29 43页 doc 195KB 19阅读

用户头像

is_721103

暂无简介

举报
基于Android操作系统的足球小将手机游戏毕业论文基于Android操作系统的足球小将手机游戏毕业论文 石家庄科技信息职业学院 题目:基于Android操作系统的足球小将手机游戏 0 摘要: 近年来,随着经济的日益发展,人们的生活水平不断提高,生活质量也在渐渐的改善。适当的游戏对人们的业余生活是不可必缺的。说到游戏,种类有好多种。在电脑游戏上的分类也很多。RCG(赛车游戏)、FTG(格斗游戏)、SPG(体育游戏)、RPG(角色扮演)、ACT(动作游戏)、AVG(冒险游戏)、PUZ(益智游戏) 等等。虽说繁多的游戏种类让人目不暇接,游戏的可玩性、可延续性和可对比性是益智...
基于Android操作系统的足球小将手机游戏毕业论文
基于Android操作系统的足球小将手机游戏毕业 石家庄科技信息职业学院 题目:基于Android操作系统的足球小将手机游戏 0 摘要: 近年来,随着经济的日益发展,人们的生活水平不断提高,生活质量也在渐渐的改善。适当的游戏对人们的业余生活是不可必缺的。说到游戏,种类有好多种。在电脑游戏上的分类也很多。RCG(赛车游戏)、FTG(格斗游戏)、SPG(体育游戏)、RPG(角色扮演)、ACT(动作游戏)、AVG(冒险游戏)、PUZ(益智游戏) 等等。虽说繁多的游戏种类让人目不暇接,游戏的可玩性、可延续性和可对比性是益智类游戏深受各年龄阶层玩家欢迎的原因。当今网络发展迅速,益智类游戏被广泛运用到网络各大平台上。借鉴网络各大平台上的益智游戏,我利用java 、Android API语言开发了本游戏项目。我通过Eclipse 、Android SDK 利用Java语言编写的《足球小将》,在游戏中控制自己的球员击球、进门,达到一定分数获得胜利。 关键字: 足球小将;道具;声音;分数;关卡 1 ABSTRACT: In recent years, growing as the economy, improving people's living standard and quality of life has also gradually improved. Appropriate games on people’s spare time are not lack of will. There are so many kind of game. Also the classification of the computer games. Such as RCG (racing game), FTG (Fighting Game), SPG (sports games), RPG (role playing), ACT (action game), AVG (adventure game), PUZ (Puzzle Games) and so on. Although there are too many kinds for the eye to take in. continuity and comparability is a popular puzzle game player of all ages welcome reason. The rapid developments of today’s networks, puzzle games are widely applied to various network platforms. I use Java, Android the API language development of the game project.I through Eclipse Android SDK Java language prepared by the" football", in the game, players control their own hit the door, reaching certain scores victory. Key words: Football Soccer;Prop; sound; scores; levels 2 目 录 一、 前言……………………………………………………………………3 二、 相关研究综述…………………………………………………………5 三、 研究的目标、内容与意义……………………………………………6 3.1 研究目标…………………………………………………………6 3.2 研究主要内容……………………………………………………6 3.2 研究的意义………………………………………………………6 四、 Android程序设计相关技术概论……………………………………..8 4.1 XML界面布局………………………………………………….9 4.2 Android的Activity组件………………………………………9 4.3 SQLite数据库………………………………………………….9 4.4 Android 2D图形编程…………………………………………9 五、 游戏研究的重点、算法与思路……………………………………… 10 5.1游戏研究的重点……………………………………………10 5.2游戏研究的算法……………………………………………16 5.3游戏界面………………………………........………………20 5.4游戏的思路…………………………………………………26 六、 论文…………………………………………………………… 28 参考文献…………………………………………………………………… 30 致谢………………………………………………………………………...31 附录一(游戏截图)…………………………………………………............32 3 前 言 现在,游戏的类型也由最初的动作游戏和简单益智游戏向更复杂、更高智力,更具真实性的游戏发展。目前的游戏种类繁多,包括角色扮演、仿真模拟类、人工智能、休闲类、渲染类、网络类等等,甚至有的游戏包含了好几种类型。 足球小将游戏一直以来都很多。但仿真模拟类的游戏却有不少,现在休闲类的技术广泛的应用到很多游戏里面等等。最广泛应用的应该就是交换排列检测。随着技术的不断提高,玩家对游戏真实性的要求也不断提高。相信益智类游戏的技术,以后会更加深入各种游戏之中。 鉴于游戏的对社会的巨大影响力和光辉的发展前景,以及我们自己对游戏爱好,这次的毕业设计我们决定尝试设计和制作一个具有一定可玩性的游戏。期间,我们收集相关资料、研究同类型的游戏、阅读有关这类型游戏和相关技术性的书籍,通过制作游戏项目来熟悉游戏的制作思路、过程,加深对面向对象编程语言的掌握,培养自己的耐心、细心和考虑问题的全面性,同时解决本课题要完成的问题,如游戏框架如何构建,如何将DirectX的内容封装,如何完善游戏的各种功能,如何能让游戏有音乐和音效的实现,如何能让游戏过关,如何能让游戏界面美观,看起来舒服感觉。 4 二、相关研究综述 近年来,国内外的专家学者以及一线的开发人员从理论、方法、技术等不同的角度对Android手机操作系统进行了一定的研究。本小节将从Android手机操作系统的发展历程、研究现状、程序开发设计简介四个方面分析总结国内外的相关研究结果。 今天我们来聊一聊Android系统的历史,首先我们就要先来说说Android系统这个名字的来历。Android这一次最先出现在法国作家利尔 亚当在1886年发飙的科幻小说《未来夏娃》中,作者将外像人类的机器起名为Android,这也就是Android小人名字的由来。 知道了Android名字的来历我们再来看一下Android系统的来历。Android系统一开始并不是由谷歌研发出来了,Android系统原来的公司名字就叫做Android,谷歌公司在2005收购了这个仅成立22月的高科技企业。Android系统也开始由谷歌接手研发,Android系统的负责人以及Android公司的CEO安迪?鲁宾成为谷歌公司的工程部副总裁,继续负责Android项目的研发工作。 在2007年11月5日这天,谷歌公司正式向外接展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家 手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系统以及应用软件,将共同开发Android系统的开放源 代码。 5 三、研究的目标、内容与意义 3.1 研究目标 本项目主要研究的目标分为:程序设计思想实践改进目标、Android平台手机开发技术的研究目标。 (1)运用面向对象的编程思想统一过程,对Chess足球小将手机游戏的系统结构、过程、功能等要素进行可视化的描述,为Android程序设计的可视化提供方法、技术上的支持,为系统的理论模型和软件建模提供参照。 (2)本系统中使用了多种基于Android平台的软件开发技术,根据要实现的系统功能,系统需要使用到的技术及技术研究的目标主要有: 手机游戏用户界面的人性化、个性化界面布局,给用户以良好的游戏体验; 移动设备上的图形编程,提供流畅靓丽的游戏过程界面; 3.2 研究主要内容 项目研究的内容主要有以下二大块: 第一部分是手机游戏的界面设计和背景音效的设计。和PC上的游戏开发有些许不同,手机游戏更加的注重用户体验,一个人性化的、时尚靓丽的游戏界面和优美个性化的音效设计是一个成功的手机游戏要达到的基本要求。 第二部分是对局智能程序的设计。可以和设计好的AI(Artificial Intelligence)算法进行游戏。人工智能程序设计是一项对算法要求很高的程序设计,特别是在手机这种硬件资源紧缺的环境中,更是需要一个高效的算法来提供强大的AI对局支持 3.3 研究的意义 游戏制作的目的是满足了人们休闲的需要,在紧张工作之余益智类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友,也可以到达跨省、跨市,甚至跨国间人们互相娱乐的目的。而消消看游戏学会锻炼眼力,时间利用快速、连续的移动,在十行十列限制区内,交换相对一致球移动。消消看除了掌握正确的动作和遵循一般的规律以外,还应学会一些特殊的变化。变节奏和变位置的,以避免加分被对手赢了。应掌握多种方式的移动球,做到能里能外,而且学会多获取随机出现增加的新球。 足球小将游戏是一个比较经典的游戏,根据软件工程有关的规范,以合理的开发 6 原则,设计出消消看游戏,并给人们的生活带来唯美的艺术享受和健康愉快的补充。 游戏软件是一种与文化背景密切联系的产品,具有很强的民族性和丰富的文化内涵。伴随着游戏软件在市场上的销售,与其相关的文化也随之传播。因此发展我国自主的益智、健康的游戏软件已是当务之急。游戏是一种基于计算机的应用软件,是新型的休闲娱乐方式。当前开发的游戏软件应该做到知识性、娱乐性、趣味性、教育性相统一。 通过此次课题的设计,掌握制作一个游戏软件的方法,以及制作游戏软件的整个流程,制作游戏软件的步骤,为以后的就业工作打下基础。 7 四、 Android程序设计相关技术概论 Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下几个层次: 图4.1 Android系统架构 4.1 XML界面布局 XML 是一种基于 XML 的语言,因此需要对 XML(特别是 XML 名称空间)很熟悉。XML是英文“XML User Interface Language”的首字母缩写。顾名思义,它是一种应用XML来描述使用者界面的标示语言。 4.2 Android的Activity组件 Activity,一般代表手机屏幕的一屏,相当于浏览器的一个页面。在Activity中添加view,实现应用界面和用户交互。一个应用程序一般由多个Activity构成,这些Activity之间可互相跳转,可进行页面间的数据传递。每个Activity都有自己的生命周期。 4.3 SQLite数据库 8 在Android平台上,集成了一个嵌入式关系型数据库—SQLite。SQLite是支持结构化查询的轻量级数据库,能很好得适应于移动设备的应用。 Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。 4.4 Android 2D图形编程 1、Simple Graphics in View:就是直接使用Android已经实现的一些画图操作,比如说images,shapes,colors,pre-defined animation等等。这种方式只能画静态或者极为简单的2D图画,对于实时性很强的动画,高品质的游戏都是没法实现的。2、Canvas:首先我们要明白这个Canvas是一个2D的概念,是在Skia中定义的。也就是说在这个方式下还是说的画2D图形。 9 五、 游戏研究重点、算法与思路 5.1游戏研究的重点 1.1 如何拼接 用一张整图不现实,这样会影响程序的执行效率,而且很占空间 只有通过图块的拼接。 1.2 装载地图 将地图索引写进文件,在程序装载的时候,通过输入输出流来读 地图内容。 2、游戏按键 在游戏中通过手触或者使用左右键使球员左右移动,通过判断击球的角度来确定足球运行的方向和速度,当你有事需要处理时,你可以点击两个比分中间的标志,来暂停住游戏的运行。 3、关卡 关卡地图的设置:不同的关卡,对手的移动速度是不同的 4、帮助信息 (1)让自己的队员击中球 (2)抓住时间打中道具,让你有更大的赢面。 (3)控制左右键来使球员移动。 5.2游戏研究的算法 (1)后台电脑判断左右移动 public class AIThread extends Thread{ GameView father; //视图类引用 boolean flag; //循环控制变量 int sleepSpan = 30; //睡眠时间 //构造器,初始化成员变量 public AIThread(GameView father){ this.father = father; flag = true; //设置线程标志位 } //线程启动后的执行方法 public void run(){ while(flag){ int d = father.ball.direction; //获取足球运动方向 if(d >0 && d<8){ //如果足球方向偏左 father.aiDirection = 4; //AI运动方向改为向左 } else if(d>8 && d<15){ //如果足球方向偏右 father.aiDirection = 12; //AI运动方向改为向右 } try{ Thread.sleep(sleepSpan); //休眠一段时间 10 } catch(Exception e){ e.printStackTrace(); //打印并捕获异常 } } } } (2)碰撞测试(足球与边框) public void checkForBorders(){ int d = direction; //左右是不是出边界了 if(x <= father.fieldLeft){ //撞了左边界 if(d>8 && d<16 && d!=12){ //如果不是正撞到左边界 if(Math.random() < changeOdd){ //一定概率概率沿正确反射路线变向 direction = 16 - direction; } else{ //一定概率随机变向 direction = (direction>12?1:5) + (int)(Math.random()*100)%3; } } else if(d == 12){ //如果是正撞到左边界 if(Math.random() < 0.4){ //注意这个概率要小,因为正撞上去希望随机变向的概率大一些 direction = 4; } else{ direction = (Math.random() > 0.5?3:5); } } } else if(x > father.fieldRight){ //撞到右边界 if(d >0 && d<8 && d!=4){ if(Math.random() < changeOdd){ //按正常反射路线变向 direction = 16-direction; } else{ //一定几率随机变向 direction = (direction>4?9:13) + (int)(Math.()*100)%3; random } } 11 else if(d == 4){ //如果是正撞到右边界 if(Math.random() < 0.4){ direction = 12; } else{ direction = (Math.random()>0.5?11:13); } } } d = direction; //判断是否撞到上边界 if(y < father.fieldUp){ //不是正撞 if(d>0 && d<4 || d>12&&d<16){ if(Math.random() < changeOdd){ //一定几率沿正确反射路线变向 direction = (d>12?24:8) - d; } else{ //一定几率随机变向 direction = (d>12?9:5) + (int)(Math.random()*100)%3; } } else if(d == 0){ //正撞到上边界 if(Math.random() < 0.4){ //一定几率沿正确反射路线返回 direction = 8; } else{ direction = (Math.random() < 0.5?7:9); //一定几率随机变向 } } } //判断是否撞到下边界 else if(y > father.fieldDown){ //不是正撞 if(d >4 && d<12 && d!=8){ if(Math.random() < changeOdd){ //按正常反射路线变向 direction = (d>8?24:8) - d; } else{ //随机变向 direction = (d>8?13:1) +(int)(Math.random()*100)%3; } } else if(d == 8){ //正撞到下边界 if(Math.random() < 0.4){ //正常变向 12 direction = 0; } else{ //随机变向 direction = (Math.random()>0.5?1:15); } } } } /* * 此方法检测是否碰到AI运动员,如果碰到,则调用handleCollision方法处理碰撞, * 同时播放声音设置足球新速率和设置lastKicker */ public void checkForAIPlayers(){ int r = (this.ballSize + father.playerSize)/2; for(Player p:father.alAIPlayer){ if((p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){ //发生碰撞 handleCollision(this,p); //处理碰撞 if(father.father.wantSound && father.father.mpKick!=null){ //播放声音 try { //用try/catch语句包装 father.father.mpKick.start(); } catch (Exception e) {} } velocity = p.power; lastKicker = 8; //记录最后一脚是谁踢的 } } } /* * 此方法检测是否碰到了玩家 的足球运动员, */ public void checkForUserPlayers(){ int r = (this.ballSize + father.playerSize)/2; for(Player p:father.alMyPlayer){ if((p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){ //发生碰撞 handleCollision(this,p); //处理碰撞 if(father.father.wantSound && father.father.mpKick!=null){ //播放声音 try { father.father.mpKick.start(); } catch (Exception e) {} } velocity = p.power; //被 赋予新速度 13 lastKicker = 0; //记录最后一脚谁踢的 } } } /* * 此方法处理足球和运动员之间的碰撞,AI和玩家的处理方式是一样的, * 首先查看Player对象的movingDirection,再综合Player对象的 * attackDirection,确定方向范围,类似直角坐标系中的4个象限, * 然后在方向范围中随机产生一个,这样产生的方向有惯性在里面,看着 * 比较真实。需要注意的是如果足球和运动员碰撞时运动员静止不动, * 那么可选的方向就是1或15(进攻方向朝上)、7或9(进攻方行朝下) */ public void handleCollision(Ball ball,Player p){ switch(p.movingDirection){ case 12: //移动方向向左 if(p.attackDirection == 0){ //攻击方向向上 ball.direction = 13 + (int)(Math.random()*100)%3; //取13,14,15中一个 } else{ //攻击方向向下 ball.direction = 9 + (int)(Math.random()*100)%3; //取9,10,11中一个 } break; case 4: //移动方向向右 if(p.attackDirection == 0){ //攻击方向向上 ball.direction = 1 + (int)(Math.random()*100)%3; //取1,2,3中一个 } else{ //攻击方向向下 ball.direction = 5 + (int)(Math.random()*100)%3; //取5,6,7中一个 } break; default: //没有移动 if(p.attackDirection == 0){ //攻击方向向上 ball.direction = 15 + (int)(Math.random()*100)%3; //取1,2,3中一个 if(ball.direction > 15){ ball.direction = ball.direction % 16; } } else{ //攻击方向向下 ball.direction = 7 + (int)(Math.random()*100)%3; //取7,8,9中一个 } 14 break; } } /* * 此方法用于检测是否进球,如是,则相应球队得分加1,然后判断游戏是否结束(游戏规则是谁先进够8个谁就赢) */ public void checkIfScoreAGoal(){ if(this.y <= father.fieldUp && this.x > father.AIGoalLeft && this.x < father.AIGoalRight){ //上方球门进球,即玩家 isPlaying = false; father.scores[0]++; father.checkIfLevelUp(); } else if(this.y >= father.fieldDown && this.x > father.myGoalLeft && this.x < father.myGoalRight){ //AI进球 isPlaying = false; father.scores[1]++; father.checkIfLevelUp(); } } //升级方法 public void levelUp(){ this.minVelocity +=3; if(minVelocity > 20){ minVelocity = 20; } } /* * 该方法判断是否碰到了Bonus,如果碰到,对相应的Bonus进行操作 * 改变其状态,调用其方法修改游戏参数等等,并播放声音 */ public void checkForBonus(){ if(father.balLive.size() != 0){ for(Bonus b:father.balLive){ if((b.x - x)*(b.x - x) + (b.y-y)*(b.y-y) <= (b.bonusSize/2+ballSize/2)*(b.bonusSize/2+ballSize/2) && b.status == Bonus.LIVE){ b.status = Bonus.EFFECTIVE; father.balLive.remove(b); b.setTarget(this.lastKicker); b.doJob(); b.setTimeout(Bonus.EFFECT_SPAN); if(father.father.wantSound){ 15 if(b instanceof IceBonus){ //是冰冻小球 try { father.father.mpIce.start(); } catch (Exception e) {} } else if( b instanceof LargerGoalBonus){ //是扩大球门的 try { father.father.mpLargerGoal.start(); } catch (Exception e) {} } } break; } } } } 5.3游戏界面 public class FootballActivity extends Activity { View current; // 记录当前View GameView gv; // GameView对象 WelcomeView welcome; // 欢迎界面 LoadingView lv; // 进度条加载界面 int keyState = 0; // xxxx00为不动,xxxx10为向左,xxxx01为向右 PlayerMoveThread pmt; // 移动球员位置的线程 boolean wantSound = true; // 是否播放声音标志位 int[] layoutArray; // 表示球员球场站位的数组 MediaPlayer mpWelcomeMusic; // 游戏开始前的欢迎音乐 MediaPlayer mpKick; // 踢球音效 MediaPlayer mpCheerForWin; // 赢了的音乐 MediaPlayer mpCheerForLose; // 输了的音乐 MediaPlayer mpCheerForGoal; // 进球后的音乐 MediaPlayer mpIce; // 撞到冰山后的音乐 MediaPlayer mpLargerGoal; // 撞到打开球门后的音乐 Rect[] rectPlus; // 代表增加球员按钮的矩形框 Rect[] rectMinus; // 代表减少球员按钮的矩形框 Rect rectSound; // 是否播放声音按钮的矩形框 Rect rectStart; // 开始按钮的矩形框 Rect rectQuit; // 退出按钮的矩形框 Rect rectGallery; // 表示Gallery的矩形框 int[] imageIDs = { // 存放8个俱乐部的图片ID R.drawable.club_1, R.drawable.club_2, R.drawable.club_3, 16 R.drawable.club_4, R.drawable.club_5, R.drawable.club_6, R.drawable.club_7, R.drawable.club_8 }; int clubID = imageIDs[0]; // 记录用户选择的俱乐部的ID public void onCreate(Bundle savedInstanceState) { // 重写onCreate方法 super.onCreate(savedInstanceState); initWelcomeSound(this); // 初始化开场动画音乐 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); welcome = new WelcomeView(this); // 将屏幕切到欢迎界面 setContentView(welcome); // current是当前activity中打开的视图 current = welcome; // wantSound一个变量表示用户是否开启音乐 if (wantSound && mpWelcomeMusic != null) { // 如需要,播放相应声音 mpWelcomeMusic.start(); } initRects(); // 初始化用于匹配点击事件的矩形框 } // 方法:初始化欢迎界面的声音 public void initWelcomeSound(Context context) { mpWelcomeMusic = MediaPlayer.create(context, R.raw.music); } // 方法:初始化矩形框 public void initRects() { rectPlus = new Rect[3]; rectMinus = new Rect[3]; for (int i = 0; i < 3; i++) { rectPlus[i] = new Rect(244, 200 + 40 * i, 280, 236 + 40 * i); rectMinus[i] = new Rect(280, 200 + 40 * i, 316, 236 + 40 * i); } rectSound = new Rect(135, 370, 185, 420); rectStart = new Rect(205, 425, 295, 475); rectQuit = new Rect(25, 425, 115, 475); rectGallery = new Rect(10, 10, 310, 110); } @Override public boolean onTouchEvent(MotionEvent event) {// 重写onTouchEvent方法 if (event.getAction() == MotionEvent.ACTION_UP) {// 判断事件类型 17 int x = (int) event.getX(); // 获得点击处的X坐标 int y = (int) event.getY(); // 获得点击处的Y坐标 if (current == welcome) {// 如果当前界面是欢迎界面 if (rectGallery.contains(x, y)) { // 用户点击的是Gallery welcome.cg.galleryTouchEvnet(x, y); // 交给Gallery来处理点击事件 } else if (rectSound.contains(x, y)) { // 点下的是声音选项 this.wantSound = !this.wantSound; // 更改声音选项 return true; } else if (rectStart.contains(x, y)) { // 点下开始键 if (checkLayout(welcome.layout)) { // 检查玩家选择的布局是否正确 layoutArray = welcome.layout; // 获得玩家选择站位布局 lv = new LoadingView(this); // 创建读取进度View this.setContentView(lv); // 将屏幕设为读取进度的LoadingView this.current = lv; // 记录当前View lv.lt.start(); // 启动LoadingView的刷屏线程 new Thread() { // 启动一个新线程,在其中创建GameView对象 public void run() { if (wantSound) { initSound();// 初始化声音 } // 创建 // 创建游戏界面 lv.progress = 100; welcome = null; // 释放掉WelcomeView } }.start(); gv = new GameView(FootballActivity.this, imageIDs[welcome.cg.currIndex]); } } else if (rectQuit.contains(x, y)) { // 按下退出键 System.exit(0); // 程序退出 } else { // 检查是否按下了修改队员站位的加号和减号按钮 for (int i = 0; i < 3; i++) { if (rectPlus[i].contains(x, y)) { // 如果有加号按钮点下,就增加对应进攻防守线上人数 // 如果有富余的人再加 if (welcome.layout[0] + welcome.layout[1] + welcome.layout[2] < 10) { welcome.layout[i]++; } break; } 18 if (rectMinus[i].contains(x, y)) {// 如果有减号按钮点下,就减少相应人数 if (welcome.layout[i] > 0) { // 如果该处人数不为零,就减少一个 welcome.layout[i]--; } break; } } } } else if (current == gv) { // 如果当前显示的View为GameView if (gv.rectMenu.contains(x, y)) { // 如果点下了菜单按钮 gv.isShowDialog = true; // 设置显示对话框 gv.ball.isPlaying = false; // 足球停止移动 pmt.flag = false; // 使PlayerMoveThread空转 } else if (gv.rectYesToDialog.contains(x, y)) { // 如果点下的是对话框中的”是“按钮 if (gv.isShowDialog) { // 检查对话框是不是正在显示 welcome = new WelcomeView(this); // 新建一个WelcomeView setContentView(welcome); // 设置当前屏幕为WelcomeView welcome.status = 3; // 直接设为待命状态 current = welcome; // 记录当前屏幕 gv = null; // 将GameView指向的对象声明为垃圾 if (wantSound && mpWelcomeMusic != null) { // 如需要,播放声音 mpWelcomeMusic.start(); } } } else if (gv.rectNoToDialog.contains(x, y)) { // 如果点下的是对话框中的”否“按钮 if (gv.isShowDialog) { // 检查对话框是不是正在显示 gv.isShowDialog = false; // 不显示对话框 pmt.flag = true; // 设置双方球员可移动 gv.ball.isPlaying = true; // 设置足球可移动 } } } else if (current == lv) { // 如果当前屏幕为LoadingView if (lv.progress == 100) { // 如果进度达到100% setContentView(gv); // 屏幕切换到GameView current = gv; // 记录当前View lv = null; // lv指向的对象声明为垃圾 // 将欢迎界面的音乐关掉 if (mpWelcomeMusic.isPlaying()) { mpWelcomeMusic.stop(); 19 } // 启动线程,线程控制球,奖品和ai球员 gv.startGame(); // 开始游戏 } } } return true; } // 方法:加载游戏中用到的声音 public void initSound() { mpKick = MediaPlayer.create(this, R.raw.kick); updateProgressView();// 更新进度条 mpCheerForWin = MediaPlayer.create(this, R.raw.cheer_win); updateProgressView();// 更新进度条 mpCheerForLose = MediaPlayer.create(this, R.raw.cheer_lose); updateProgressView();// 更新进度条 mpCheerForGoal = MediaPlayer.create(this, R.raw.cheer_goal); updateProgressView();// 更新进度条 mpLargerGoal = MediaPlayer.create(this, R.raw.lager_goal); updateProgressView();// 更新进度条 mpIce = MediaPlayer.create(this, R.raw.ice); updateProgressView();// 更新进度条 } // 更新进度条的进度 public void updateProgressView() { lv.progress += 15; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) {// 处理键盘按下事件的回调方法 switch (keyCode) { case 21: // 左 keyState = keyState | 2; keyState = keyState & 0xfffffffe; // 清除掉其他的键盘状态 break; case 22: // 右 keyState = keyState | 1; keyState = keyState & 0xffffffd; // 清除掉其他的键盘状态 break; default: break; } return true; 20 } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // 处理键盘抬起事件的回调方法 switch (keyCode) { case 21: // 左 keyState = keyState & 0xffffffd; // 清楚该状态位 break; case 22: // 右 keyState = keyState & 0xfffffffe; // 清楚该状态位 break; default: break; } return true; } // 检查用户输入的layout合不合法 public boolean checkLayout(int[] layout) { int sum = 0; for (int i = 0; i < layout.length; i++) { // 遍历存放球员站位的数组 if (layout[i] < 0) { // 如果发现某个进攻/防守阵线上的球员为负数 return false; } else { sum += layout[i]; // 将各个阵线上的球员个数相加 } } if (sum == 10) { // 如果和为10,则该站位合法 return true; } else { return false; // 返回false } } } 游戏的主类,负责切换视图,接收和捕获用户的键盘输入并做相应处理。游戏的欢迎View,加载进度的View和游戏视图View在这里都有引用,可以切换,通过onTouchEvent方法处理函数来接受用户点击屏幕事件(如图2) public class CustomGallery { Bitmap[] bmpContent; // Gallery要显示的内容图片 int length; // Gallery要显示的图片数组大小 int currIndex; // 当前被显示的图片的索引 21 int startX; // 绘制Gallery时其左上角在屏幕中的X坐标 int startY; // 绘制Gallery时其左上角在屏幕中的Y坐标 int cellWidth; // 每个图片的宽度 int cellHeight; // 每个图片的高度 // 构造器,初始化主要成员变量 public CustomGallery(int startX, int startY, int cellWidth, int cellHeight) { this.startX = startX; this.startY = startY; this.cellWidth = cellWidth; this.cellHeight = cellHeight; } public void setContent(Bitmap[] bmpContent) { // 方法:为Gallery设置显示内容 this.bmpContent = bmpContent; this.length = bmpContent.length; } public void setCurrent(int index) { // 方法:设置当前显示的图片 if (index >= 0 && index < length) { this.currIndex = index; } } public void drawGallery(Canvas canvas, Paint paint) {// 方法:绘制自己 // 创建背景的画笔 Paint paintBack = new Paint(); paintBack.setARGB(220, 99, 99, 99); // 创建边框的画笔 Paint paintBorder = new Paint(); paintBorder.setStyle(Paint.Style.STROKE); paintBorder.setStrokeWidth(4.5f); paintBorder.setARGB(255, 150, 150, 150); // 画左边的图片 if (currIndex > 0) { canvas.drawRect(startX, startY, startX + cellWidth, startY + cellHeight, paintBack); // 背景 canvas.drawBitmap(bmpContent[currIndex - 1], startX, startY, paint); // 贴图片 canvas.drawRect(startX, startY, startX + cellWidth, startY + cellHeight, paintBorder); // 画左边图片的边框 } // 画被选中的图片 canvas.drawRect(startX + cellWidth, startY, startX + cellWidth * 2, 22 startY + cellHeight, paintBack); // 背景 canvas.drawBitmap(bmpContent[currIndex], startX + cellWidth, startY, paint); // 贴图片 // 画右边的图片 if (currIndex < length - 1) { canvas.drawRect(startX + cellWidth * 2, startY, startX + cellWidth * 3, startY + cellHeight, paintBack); // 背景 canvas.drawBitmap(bmpContent[currIndex + 1], startX + cellWidth * 2, startY, paint); // 贴图片 paintBorder.setARGB(255, 150, 150, 150); // 画右边图片的边框 canvas.drawRect(startX + cellWidth * 2, startY, startX + cellWidth * 3, startY + cellHeight, paintBorder); } // 画选中的边框 paintBorder.setColor(Color.RED); canvas.drawRect(startX + cellWidth, startY, startX + cellWidth * 2, startY + cellHeight, paintBorder); } public void galleryTouchEvnet(int x, int y) { // 方法:Gallery的处理点 击事件方法 if (x > startX && x < startX + cellWidth) { // 点在了左边那张图片 if (currIndex > 0) { // 判断当前图片的左边还有没有图片 currIndex--; // 设置当前图片为左边的图片 } } else if (x > startX + cellWidth * 2 && x < startX + cellWidth * 3) { // 点在了右边那张图片 if (currIndex < length - 1) { // 判断当前图片的右边还有没有图片 currIndex++; // 设置当前图片为右边的图片 } } } 该类为自定义的gallery,为实现Gallery的效果 主要是界面上方用于显示玩家所选的队伍标志 23 public class LoadingView extends SurfaceView implements SurfaceHolder.Callback { FootballActivity father; // Activity的引用 Bitmap bmpProgress; // 显示进度时图片 Bitmap[] bmpProgSign; // 进度条上的标志物 Bitmap bmpLoad; // 进度条图片对象 int progress = 0; // 进度,0到100 int progY = 330; // 进度条的Y坐标 LoadingDrawThread lt; // LoadingView的刷屏线程 public LoadingView(FootballActivity father) {// 构造器,初始化主要成员变量 super(father); // 调用父类构造器 this.father = father; initBitmap(father); // 初始化图片 getHolder().addCallback(this); // 添加Callback接口 lt = new LoadingDrawThread(this, getHolder());// 创建刷屏线程 } public void doDraw(Canvas canvas) {// 方法:绘制屏幕 24 canvas.drawColor(Color.BLACK); // 清屏幕 canvas.drawBitmap(bmpLoad, 10, 100, null); // 画加载时图片 canvas.drawBitmap(bmpProgress, 5, progY, null); // 画进度条图片 // 画遮盖物 Paint p = new Paint(); // 创建画笔对象 p.setColor(Color.BLACK); // 设置画笔颜色 int temp = (int) ((progress / 100.0) * 320); // 将进度值换算成屏幕上的长度 canvas.drawRect(temp, progY, 315, progY + 20, p); // 画遮盖物挡住进度条图片 // 画进度条标志物 for (int i = 0; i < 3; i++) { canvas.drawBitmap(bmpProgSign[i], 140 * i, progY - 10, null); } if (progress == 100) { // 绘制进度条已满的提示文字 p.setTextSize(13.5f); p.setColor(Color.GREEN); canvas.drawText("单击屏幕开始游戏...", 100, progY + 50, p); } else { // 绘制进度条未满的提示文字 p.setTextSize(13.5f); p.setColor(Color.RED); canvas.drawText("加载中,请稍后....", 120, progY + 50, p); } } public void initBitmap(Context context) {// 方法:初始化图片 Resources r = context.getResources(); // 获取资源对象 bmpProgress = BitmapFactory.decodeResource(r, R.drawable.progress); // 初始化进度条图片 bmpProgSign = new Bitmap[3]; // 初始化进度条标志物 bmpProgSign[0] = BitmapFactory.decodeResource(r, R.drawable.prog1); bmpProgSign[1] = BitmapFactory.decodeResource(r, R.drawable.prog2); bmpProgSign[2] = BitmapFactory.decodeResource(r, R.drawable.prog3); bmpLoad = BitmapFactory.decodeResource(r, R.drawable.load); // 初始化加载图片 } @Override protected void finalize() throws Throwable { System.out.println("############ LoadingView is dead##########"); super.finalize(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, 25 int height) {// 重写surfaceChanged方法 } @Override public void surfaceCreated(SurfaceHolder holder) {// 重写surfaceCreated方法 if (!lt.isAlive()) { // 如果后台刷屏线程还未启动,就启动线程刷屏 lt.start(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) {// 重写surfaceDestroyed方法 lt.flag = false; // 停止刷屏线程 } } 该类继承自SurfaceView,主要的功能是在后台加载、创建对象时在前台 显示进度 5.4游戏的思路 1.资料研究。 2.框架的设计与修改。 26 3.建立游戏大厅。 4.建立玩家进入房间后连接游戏区域。 5.游戏基本界面。 6.各种碰撞消除算法的实现。 7.游戏道具。 8.分数和关卡的实现。 9.实现界面。 10.音效及其他一些功能实现。 11.游戏测试完整。 27 六、 论文总结 经过近1.5个月的开发,在指导老师的细心教导和同学的热情帮助下,我终于完成了毕业开题,毕业设计,毕业论文,详细开发说明文档。 在这次毕业设计的制作过程中,我强烈感觉到自己知识的贫乏,和对以往学习过的知识掌握不够。从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。在与指导老师的交流讨论中我的题目定了下来,是:足球小将游戏。当选题报告,开题报告定下来的时候,我当时便立刻着手资料的收集工作中,当时面对浩瀚的书海和一个空白的项目真是有些茫然,不知如何下手。我将这一困难告诉了导师,在导师细心的指导下,终于使我对自己现在的工作方向和方法有了掌握。为了本次的毕业设计及论文,我专门准备了一个笔记本电脑。我在学校图书馆,学校的FTP(文件传输服务器)搜集资料,还在网上查找各类相关资料,将搜索到的资料全部储存在笔记本电脑上,尽量使我的资料完整、精确、数量多,这有利于毕业设计的开发。然后我将收集到的资料仔细整理分类。资料已经查找完毕了,我开始着手开发。在研究的工作过程中遇到困难我就请教导师以及专业课老师,并和同学互相交流讨论,还请教了在职的游戏和软件开发的人员。在大家的帮助下,困难一个一个解决掉,项目也慢慢成型。经过多次测试和仔细修改,游戏终于完成了。整个过程中,从需求分析到设计、编码、测试,我都力求规范化和文档化,努力让自己以前学的知识运用到本游戏的开发中,尽量保证整个系统的开发进度和质量,顺利完成这次的毕业设计,为自己的大学生涯画上一个完美的句号。但是经过指导老师的指导,我经过不断努力学习,终于完成了这个作品。在这个过程中,我们遇到了很多困难。但是经过我的努力,游戏最终完成了。在制作足球小将游戏的过程中,我感觉我的编程能力,沟通协调能力各方面的能力都有了很大的提高。 足球小将游戏的大部分功能开发,具有一定的可玩性和复杂性。虽然经过了我们大量的调试和排错解决了绝大部分的问题,但限于我们精 28 力、技术、时间和水平实在有限,难免还存在一些BUG;因此要改进的地方比较多,关卡比较简单。我相信,随着时间的推移,个人水平的增长,我一定会扩展这个程序,使其更加完善、丰富。 不过,在系统开发过程中,好多知识都是随学随用,就增加了很多不必要的麻烦。比如说在碰撞算法上的计算方法,因为本来自己的数学根基比较差,所以理解起来比较吃力,但最终我还是把他吃透,造出现在的毕业设计。继续努力学习,更加努力严格要求自己。 七、 参考文献 29 [1] 殷兆麟编著. Android程序设计 [M]. 北京:高等教育出版社, 2002. [2] 侯俊杰编著. Android程序设计与实训 [M]. 北京:科学出版社, 2005. [3] 姜志强编著. Java语言程序设计 [M].北京:电子工业出版社,2007 [4] 侯俊杰编著. Java语言应用开发基础 [M]. 吕婕编著. Java毕业设计指南与项目实践 [M]. 北[5] 孙更新, 宾晟, 京:科技出版社,2007. , 管佩森编著. Java使用编程100例 [M]. 北京:中国贴到出[6] 杜江 版社,2004. [7] 《电脑编程技巧与维护》杂志社编著. Java编程技巧典型案例解析 [8]. 北京:中国电力出版社,2005 [9]张基温,朱嘉钢,张景莉编著. Java程序开发教程 [M]. 北京:清华大学出版社,2002 [10]蔡昭权. 利用Socket实现多线程通信程序[J]. 惠州学院学报 , 2004,(06) 30 致 谢 写到这里,论文已经告一个段落了,时光茬再,三年的生活在这篇论文完成之后很快就要结束了。回想这三年的大学生活,点点滴滴犹在心头。正是有许许多多老师同学朋友的关心,我才能顺利地完成学业;正是家人在这生活中的鼓励和支持,我才能有今天。所以这里我要向所有的老师和我的家人以及所有关心爱护过我的人们表示我最真挚的谢愈。 感谢我的老师们,在课堂上、在工作室以及在毕业设计及毕业论文的撰写期间,您对我们学习上的悉心指导,对我们在学术方面的严格要求让我了解到了作为一个本科生应该具备的基本技能和做事的心态。 感谢三年来与我一起风风雨雨走过的同学以及曾经的和现在的室友们,感谢你们在大学三年这段时间对我的支持和帮助。在大学的三年里,我们一起互相学习,互相讨论,相处得很融洽,也很愉快。感谢他们四年来的帮助和支持,他们每个人身上都有我要学习的优点,特别是他们身上持之以恒和孜孜不倦的学习态度,带动我,鼓励我,使我没有虚度这三年的学习时间。点点滴滴,铭记心头,谢谢你们。 最后,感谢我所有的家人和朋友在我此期间给予我的鼓励、支持和关环。 谢谢大家~ 31 附录一(游戏截图) 图1 32 图2 33 图3 34
/
本文档为【基于Android操作系统的足球小将手机游戏毕业论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索