安卓APP源码和设计报告——Android小程序超级小猫(超级小猫游戏)
移动终端开发(Android)
结课报告
题目: Android小程序超级小猫
班级:
姓名:
成绩:
一、项目概述
1、设计背景与意义
1.1 手机游戏的设计背景
自上世纪80年代第一部手机诞生以来,随着计算机技术的进步,手机也经历了从模拟到GSM、2.5G再到今天的3G手机如此一个发展历程。特别是进入21世纪后手机的硬件性能得到很大的提高,当前主流手机普遍配有主频500MHZ的微处理器和500MB容量的存储器。与之同步发展的还有支持手机运行的手机操作系统,从当初的单片机系统到后来的专用嵌入式系统,到后来开始为智能手机设计开发出可以更高效管理手机软硬件资源的操作系统,其中有不少属于开源项目的手机操作系统。目前全球的智能手机操作系统主要以Google公司开发的Android系统、苹果公司开发的iPhone系统、诺基亚公司开发的Symbian系统、微软公司开发的WindowsMobile系统和Linux系统为代表。从图1.1为2011全球智能手机操作系统市场份额统计,Android仅仅经过两三年的发展就抢占了43%的市场份额,并保持着2%的增长速度。中国是最大的手机市场,2011年的统计数据表明,Android已取代了iPhone成为中国市场额最大的智能手机操作系统。
图1.1 2011全球智能手机操作系统市场份额统计
Android系统是Google公司于2007年推出的一款手机操作系统,目前能安装于HTC、摩托罗拉、联想、华为等知名品牌手机。它是基于Linux2.6.1内核的一个开源手机操作系统,目前最高版本为2.4,集成了GPS电子地图导航、重力感应器、多点触控等重要功能,开发者可以开发出丰富的运用。由于android智能手机操作系统是一个开源项目,具有很强的开放性和可扩展性,吸引了大量的手机软件开发人员为这些手机系统开发应用软件及休闲游戏,极大的丰富了手机功能。为服务广大的开发人员与谷歌手机用户,谷歌公司在因特网搭建了一个应用软件商店。开发人员开发出的手机应用软件可以陈列于应用软件商店中供用户挑选购买,解决了软件工程师最薄弱的软件营销环节,作为目前广大手机软件工程师最大的创收途径而博得广泛的热衷。
电脑游戏是很多人不可或缺的娱乐活动,八九十年达的“贪吃蛇”和“超级玛丽”给大家留下了欢乐的欢乐记忆,也为游戏创作者带来了巨额财富。近二十年来,随着计算机硬件性能的提升及软件开发者的努力,游戏作品不论是创意还是视听感觉都有飞跃的发展。当前电脑游戏行业非常繁荣,竞争也非常激烈,随着智能手机的问世并普及,越来越多的游戏开发人员把目光转向了手机游戏这个新兴的行业。
手机通常重量轻,随身携带方便,现代人们压力大,非常希望在工作之余,上下班途中可以通过娱乐来放松自己,此时,手机游戏便能发挥出它轻松休闲的特点。受手机性能的制约,以往运行于手机之上的游戏一般较为简单,但随着微电子技术的发展,手机性能越来越优良,现在已经可以开发出类似于PC机上的游戏。特别是随着3G移动网络的迅猛发展,可以预料在十年之内目前如火如荼的网络游戏也将转战至手机平台。
1.2 国内外手机游戏的研究现状
在手机应用开发领域当前较为火热的有J2ME语言、Object C语言和Android SDK。J2ME 作为Java2的一个组成部分,以其发展时间长而成为较为普遍的技术。其最大的优势在于移植性强,使用J2ME技术开发的程序,可以经过简单的修改以后,能在不同厂商的手机上运行。同时由于Java语言的普及从而开发周期大大缩短。但是,也因为兼顾移植性,导致其开发出的功能受到一定的限制,又因为其运行于JVM上并受手机性能的影响所以运行速度普遍较慢。Object C语言基于标准的ANSI C,其语法源于Smalltalk消息传递风格,作为iPhone手机上的标准开发语言而受到青睐。相对于J2ME最大特点是软件运行效率高速度快,界面也继承了苹果的华丽风格,遗憾的是开发出的应用软件只能运行于iPhone手机上。谷歌与开发手机联盟合作开发的Android SDK是近两年诞生的充满活力和生命力的手机开发语言,是一个标准的、开放的移动电话软件平台,不存在任何以往那种阻碍移动产业创新的专有权障碍。相对于其他开发语言,Android最大的优点就是开放性,吸引了众多的开发者的支持,短短两年时间开发出大量的手机应用软件,丰富了手机的应用功能。另外对网络友好,支持大部分网络功能,并与Google应用无缝结合,可以轻松获取Google服务。
图1.2 2011年中国移动应用超市各类手机软件下载比例
Android和手机应用市场正处于起步阶段,市场和消费者需要个接受的过程,众多开发者也都在积极探索盈利模式。Android开发者实现盈利主要依赖两方面因素,一是全球Android手机终端的爆发,另外就是海外付费应用程序的模式逐渐形成。目前Android应用开发个人或团体虽未取得规模盈利,但也开始逐渐向盈利模式转移,获得不错收益。图1.2是中国移动应用软件超市2011年的统计数据,消费者下载量最高的依然是应用开发,其次便是游戏开发,占据39%的下载量,而传统的增值业务则只占5%,在移动互联网时代,开发者纷纷逃离营运商的束缚,转向利润较为丰厚的应用程序和游戏开发。由此图也可以看出手机游戏软件在消费者中的受欢迎程度,如果想在未来手机应用程序开发中实现规模则需要加大手机游戏方面的开发力度。
目前在手机上开发出较为成功的游戏主要有FTG格斗游戏、PUZ益智类游戏、RPG角色扮演游戏、SLG模拟/战棋式战略游戏以及体感游戏和宠物养成游戏六类。其中格斗游戏诞生于街机,曾经的“街霸”是其典型代表。FTG系统的核心是对战斗部分进行碰撞检测计算。益智游戏最大的创意是其游戏规则,玩家需要以自己的智慧对游戏规则进行思考,判断从而通关以获得成就感。PUZ游戏对玩家操作要求不高是手机游戏中受众面最广的游戏,最具代表是“推箱子”。角色扮演游戏是最能与用户共鸣的游戏,开启了一扇通往虚拟现实的大门,可以让玩家沉浸于打怪升级的快乐之中,“仙剑奇侠传”是其经典代表。RPG游戏的核心是代表玩家角色成长的升级系统,游戏都贯穿一个故事情节,所以其创意是多元的、立体的,让开发者有更广阔的创作空间。战棋类游戏是玩家在虚拟地图上指挥一定角色与敌方展开战斗,典型的有“地雷战”。体感游戏主要依赖手机中的重力感应等装置开发出的新型游戏,玩家可以通过摇晃、旋转、移动等动作来操作游戏。宠物养成游戏则因为其人性化游戏情节而吸引人们注意力。
手机游戏研发的重点是游戏情节和游戏界面。游戏情节的创作依赖人的想象力和创造力,主题及素材可以来源于热门小说也可来古老传说,例如中国的经典名著“三国志”被日本光荣公司搬去后创作出名噪一时的经典同名游戏。还有著名网络小说“诛仙”也被创作为当前流行的同名网络游戏。这些文学作品为手机游戏的开发提供了大量的可创作素材。同时,行业竞争的激烈也导致雷同的不少游戏情节出现,这就要求创作人员不断发挥才能,构思出更加丰富的游戏主题。游戏界面方面随着手机性能不断提高的影响,也愈加华丽。从当初粗糙单色的俄罗斯方块到后来颜色丰富的2D游戏,再到现在开始流行的极具立体效果的3D游戏。游戏的操纵方面也有革命性发展,从最初按键操纵到后来的屏幕多点触控再发展到重力感应操纵。
1.3 本课题研究的目的、意义及研究内容
由于本人对游戏的酷爱、对代码的敏感和对童年红白机时代游戏的怀念,在Android平台下通过掌握的Java语言基础和对Android知识的深入学习,研究并开发了一款益智闯关类游戏“超级小猫”,并通过整个学习、设计和实现的过程,能提高自己的代码量和读写代码能力,为以后步入Android应用开发工作打下基础。
- 设计功能
2.1.1 需求
功能:实现主人公小猫的前进、跳跃、顶金币、顶砖块、踩敌人、吃道具等功能并有关卡设置。
操作:设置屏幕虚拟键,使玩家通过触控虚拟键对小猫的操作。
音效:游戏有背景音乐,按钮、跳跃和死亡音效。
动画效果:主人公和敌人的移动过程、死亡后的效果,砖块及问号被顶后的效果。
2.1.2开发环境
硬件:Microsoft Windows 7操作系统
IDE: Eclipse
版本:Android2.2
2.1.3游戏设计思想和模块划分
本游戏采用Java面向对象思想,将游戏中所有的对象通过划分模块进而创建各自的类。设计初期,通过对程序需求的分析,划分了游戏背景模块、游戏控制模块,游戏地图模块、道具模块、特效模块、玩家模块和敌人模块主要几个模块。而后,通过几大模块,对游戏中的对象归类,通过不断的补充各个类的属性,完善程序。
道具模块
背景模块
特效模块
控制模块
地图模块
敌人模块
玩家模块
图3.2程序模块图
2.1.4游戏具体设计
1.游戏背景模块
该模块主要实现了游戏公共背景,包括天空不断漂浮的白云,主程序显示的分数、金币个数、时间、小山和大山,虚拟键左、右、上、音乐开、音乐关、退出游戏。由BG类和JOY类实现。
BG类
该类负责画出分数、金币个数、时间、小山、大山和不断漂浮的3朵白云,之所以要把这些对象放入一个bg类中,是由于它们都是一旦绘制出来就成系统本身的了,不受玩家控制而影响。而把受玩家控制的公共背景对象写入其他类中。金币图片是一个帧动画播放位图,大、小山是用for循环有规律的画入画布中,白云的绘入是静态的,但通过让其横坐标变化和for语句判断来实现循环在页面漂浮的效果。实现代码如下:
public void upData()
{//分别以1和2的速度循环移动
yunX1-=2;
if(yunX1<-50)
{
yunX1=490;
}
yunX2-=1;
if(yunX2<-50)
{
yunX2=490;
}
yunX3-=2;
if(yunX3<-50)
{
yunX3=490;
}
}
JOY类
在此类中画出虚拟键左、右、上、音乐开、音乐关,并加入触屏监听方法。触屏的监听是一个难点,要精确计算出所绘图片宽高像素大小和玩家点击屏幕范围,这样才能准确监听到玩家所需的操作。
2.游戏控制模块
该模块主要实现了让游戏能按照预期的顺序播放画面,综合了游戏用到的所有类,根据状态执行各个类的线程。由MC类实现。
MC类
该类继承了Android中的SurfaceView绘图类,实现Runnable接口。该类引用了整个程序的所有类。创建初期,定义状态标识线程执行顺序即页面切换,是通过后续类的完成进而对MC类的补充完成。
3.游戏地图模块
该模块实现了游戏地图信息的保存,增加了游戏的扩展性。由map类和TiledMap类实现,地图信息保存在一个二维数组中位图大小经过处理为16*16,屏幕宽为480,高为320,即地图信息为20行,列根据关卡的长度自定。
4.道具模块
该模块中实现了游戏中道具毒蘑菇的控制。由类DJ类实现,主要控制毒蘑菇的移动方法和碰撞检测。
5.特效模块
该模块实现了公共图片金币的动画效果、游戏主人公死亡后显示图片效果、碰到毒蘑菇显示图片效果、杀死敌人后敌人消失效果、碰撞普通砖块后的爆炸效果、碰撞问号砖块后弹出金币效果。主要由TX、TX1、TX2、TX3、TX4、TX5、TXManager几个类分别实现。
6.玩家模块
该模块实现了游戏主人公在场景中根据玩家的控制自由移动的功能。由Player类实现。是游戏设计的难点。
7.敌人模块
该模块实现了游戏中所有敌人的控制。由NPC、NPC01、NPC02、NPC03、NPC04_guike、NPCManager几个类分别实现。
2.2游戏设计过程中遇到的问题和技术难点
2.2.1图片问题
为了游戏美观和地图设计的方便,要把图片处理成跟屏幕分辨率宽高都成比例,借助Batch Image Resizer和PS图片处理工具分别对游戏素材进行缩放和去除图片背景的操作。游戏中的主人公是位图播放,Android中提供给我们播放帧动画的方法。在绘图中,Android中的绘图类SurfaceView,默认采用双缓冲技术,保证了屏幕不出现闪烁现象。
2.2.2控制问题
游戏的控制分为系统控制和玩家控制,由系统控制的只需设置其相应的方法,在需要的时候执行相应的线程。由玩家控制的主要是对主人公的移动控制,在编写代码的过程中,左、右移动相对简单,让它跳起来一度用了不少时间学习,对跳跃加入重力引擎方法 成功解决了实现跳跃高度一定,速度变化,有真实感的跳跃动作。
2.2.3碰撞检测
游戏的核心重点在于碰撞检测方法的编写,即使绘图再美,玩家控制的再好,到了不该过去的地方照样过去,失去了游戏的规则。碰撞检测包括,游戏主人公与敌人的碰撞、主人公与障碍物的碰撞、敌人与障碍物的碰撞、道具与主人公的碰撞
玩
家
玩
家
玩
家
16*16 16*16
①
障碍物
③
玩
家
② ③
④
图3.3碰撞检测示意图
由图3.3表示,主人公与障碍物的碰撞,当在范围①时,表示在障碍物上面,可以站在上面进行跳的动作,否则就是在空中,进行下降的动作。当跳到④的范围时,表示玩家与障碍物碰撞,障碍物执行自己的方法(消失或者变化),玩家自由下落。主人公与敌人的碰撞中,当主人公在范围①—④时出于碰撞的临界点,碰撞后玩家和敌人执行自己的方法(死亡图片或者爆炸消失)。敌人与主人公的碰撞与主人公与障碍物的碰撞类似,道具与主人公的碰撞与主人公与敌人碰撞类似。
2.2.4音效控制
在本程序中对主人公的跳跃,死亡,点击主菜单按钮都加入了音效,此外游戏中还有背景音乐。这个功能的实现用了Android中的SoundPool和MediaPlayer,前者控制音效,后者控制背景音乐。部分代码如下:
主控制类MC中声明
//声明SoundPool
static SoundPool sp;
//记录背景音乐文件id
static int soundId_long;
//记录死亡音乐文件id
static int death;
//记录点击菜单音乐文件id
static int press;
//声明一个音乐播放器
private static MediaPlayer mediaplayer;
主方法中
//实例SoundPool播放器
setSp(new SoundPool(4, AudioManager.STREAM_MUSIC, 100));
//加载音乐文件获取其数据ID
//跳跃音效的初始化
setSoundId_long(getSp().load(context, R.raw.jump, 1));
//死亡音效的初始化
death = sp.load(context, R.raw.dead, 1);
//点击音效的初始化
press = sp.load(context, R.raw.coin, 1);
//背景音乐的初始化
setMediaplayer(MediaPlayer.create(context, R.raw.mario));
//设置循环播放
getMediaplayer().setLooping(true);
(new Thread(this)).start() ;
然后分别在事件响应中加入响应方法。
//点击音乐开时
if(joy.music1down==true)
{
MC.getMediaplayer().start();}
//点击音乐关时
if(joy.music2down==true){
MC.getMediaplayer().pause();
}
在Player类中加入
//当点击跳跃键时
if(joy.up_down==true){
m=1;
vy=-18;
//状态为跳跃
changeFS(2);
//此时加入点击音效
MC.sp.play(MC.getSoundId_long(), 1f, 1f, 0, 0, 1); }
2.2.5页面控制
为了实现能按照流程执行,在主控制类MC中用
switch(CanvasIndex){ case:
Berak;}语句对页面进行的切换控制。根据各个页面时时反馈的CanvasIndex值确定跳入哪一个页面。CanvasIndex值设置为0、5、10、15、20、25、30、35、40分别代表帮助页面 、logo页面、主页面、加载页面、主程序页面、结束页面、第二关切换页面、第二关加载页面、第二关主页面。用switch控制能简单有效的切换到下一个页面而退出上一个页面。
2.3 开发过程简述
游戏的开发不同于应用开发,游戏里面更多的用了绘图方法和游戏算法,所涉及的类不是分步一个一个写出来的,很多都是同时创建的,并且经过无数次的调试 。类中的属性也是时时根据需要添加进去的,使其功能逐步完善。在次过程中通过学习相关内容,阅读相关代码,不断的尝试和失败中找到属于自己的编写风格,应用到实例开发中。
二、项目设计
要求:描述设计的设计思路与设计过程,例如,界面包括什么布局、组件;功能实现如果操作:哪个组件什么事件、事件处理是什么响应
1、程序分析和具体实现
1.1游戏Logo页面
程序中有个logo类,该类负责绘制logo页面,页面状态为5,程序主控制类MC默认设置状态为5即打开程序后就显示logo页面。在这个类中加入了渐变效果。如图1.1:
图1.1
public void render(Canvas g)
{
Paint paint=new Paint();
paint.setColor(0xff000000);
g.drawRect(0,0,480,320, paint);
paint.setAlpha(a);
g.drawBitmap(im, 30,0, paint);
}
public void upData()
{
t ;
if(t>150)
{a-=10}
if(a<=0)
{ a=0;
MC.CanvasIndex=10;
t=0;
}
在480*320的画布上面绘制logo页面背景图片,由a值控制显示,下面的线程方法中,用for语句控制a值,t 直到150,这个是图片渐渐出现的效果,当t>150时,a-=10,这个是图片渐渐消失的效果,整个过程大约有5秒钟,然后自动跳转到游戏主菜单。
1.2游戏主菜单分析
程序中CanvasMain类实现了主菜单的功能。有开始游戏按钮和游戏帮助按钮,开始游戏按钮使用了图片闪烁播放效果。效果如图1.2所示:
图1.2
if(t%5==0)
{g.drawBitmap(im1,185,180,paint);
}
public void upData()
{t ;
if(t>5){
t=0;}}
用了if语句判断,使图片交替出现,达到闪烁效果,增加美感。对按钮的监听是用了Android中的触屏监听方法,监听玩家点到屏幕的范围判断操作。
//按键监听
public void penDown(float _x,float _y)
{ //判断是否点击图片区域坐标
if(Math.abs(240-_x)<40&&Math.abs(193-_y)<40){
//游戏开始,初始化游戏数据
CanvasUI.jinbiCount=0;
CanvasUI.life=3;
CanvasUI.score=0;
CanvasUI.time=0;
//跳转页面到Loading
MC.CanvasIndex=15;
}
if(Math.abs(240-_x)<40&&Math.abs(280-_y)<40)
{//播放音效
MC.sp.play(MC.press, 1f, 1f, 0, 0, 1);
MC.CanvasIndex=0;
}
}}
其中if(Math.abs(240-_x)<40&&Math.abs(193-_y)<40)
和if(Math.abs(240-_x)<40&&Math.abs(280-_y)<40)
两个if语句经过仔细计算后得出的,即在按钮大小的范围内,方便能准确监听到用户操作。当点击开始游戏时,初始化游戏数据,设定状态变量MC.CanvasIndex=15,传给MC,告诉MC应该显示开始游戏的页面了。同理,点击 游戏帮助时,由MC控制显示帮助页面。效果如图1.3所示:
图1.3
1.3 开始游戏过程的后台逻辑
当玩家点击开始游戏后,玩家看到的只有一个载入页面,显示的是玩家现在人数,而后台要经过迅速的线程加载。在MC类中实现。首先,响应的是Loading类,如下图1.4所示:
图 1.4
初始化地图信息、人物信息、敌人信息、道具信息,随后修改状态变量CanvasIndex值为20,传给MC,
case 20:
if(joy.music1down==true)
{
//开始背景音乐
MC.getMediaplayer().start();
}
if(joy.music2down==true)
{
//暂停背景音乐
MC.getMediaplayer().pause();
} //执行公共图片绘制
joy.upData();
//执行Player线程
p.upData(this,joy,mp,tm,dm,nm);
//执行地图线程
mp.upData(p, cx, cy);
//执行背景线程
bg.upData();
//执行地图线程
btm.upData(p, cx, cy,mp,nm,tm);
//执行道具线程
dm.upData(mp,p, tm);
//执行特效线程
tm.upData(mp,tm,p);
//执行胜利线程
win.upData(p, cx, cy);
//执行敌人线程
nm.upData(mp,cx,p,tm);
//执行主页面线程
cui.upData(p,tm);
//跳出
break;
效果如图1.5所示:
图 1.5
三、项目代码
要求:项目的核心代码:并在相关功能模块处添加功能说明及注释
- 布局文件代码
//开始游戏布局文件
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:dlc=”http://schemas.android.com/apk/res/com.dlc.finaldesign”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@ id/rl_gamecenter_main”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”@drawable/bg_gradient_color_lightblue”
android:orientation=”vertical” >
<!– 底部工具栏,里面有四个图片按钮 –>
<LinearLayout
android:id=”@ id/rl_gamecenter_bottom”
android:layout_width=”match_parent”
android:layout_height=”60dp”
android:layout_alignParentBottom=”true”
android:background=”@drawable/bg_gradient_color_blue”
android:orientation=”horizontal” >
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_notify”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_mygames”
dlc:text=”我的游戏”
dlc:text_size=”12sp” />
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_games”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_gamehome”
dlc:text=”游戏首页”
dlc:text_size=”12sp” />
<com.dlc.finaldesign.ui.view.ChangeColorIconWithTextView
android:id=”@ id/ccitv_gamecenter_indicator_more”
android:layout_width=”0dp”
android:layout_height=”fill_parent”
android:layout_weight=”1″
android:padding=”5dp”
dlc:icon=”@drawable/tab_moregame”
dlc:text=”更多”
dlc:text_size=”12sp” />
</LinearLayout>
<!– ViewPager –>
<!– 计算相对位置时,需要定位的布局需要计算好高度 –>
<RelativeLayout
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_above=”@id/rl_gamecenter_bottom”
android:layout_alignParentTop=”true”
android:orientation=”vertical” >
<com.dlc.finaldesign.ui.view.MyViewPager
android:id=”@ id/mvp_gamecenter_main”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_gravity=”center”
android:background=”#eee” >
</com.dlc.finaldesign.ui.view.MyViewPager>
</RelativeLayout>
</RelativeLayout>
2、类文件代码
//Player类(核心类)
public class Player extends MySprite {
public static final int SPEED = 5;
// 定义水平移动速度,和垂直速度
float vx, vy;
float vy1; // 优化碰撞检测
int m;
// 定义玛丽死亡,默认为不死
boolean PlayerIsDead = false;
boolean ishitUp; // 碰撞金币砖块
boolean isDead; // 死亡判断
// 定义是否创建对象,包括敌人,障碍物等
boolean HaveCreate;
// 定义判断是否过关
boolean nextLevel;
// 为玛丽的状态定义二维数组
static int[][] fsData = new int[][] { { 0 },// 等待
{ 0, 0, 1, 1 },// 行走
{ 2 },// 跳跃
{ 3 } // 死亡
};
// 根据玛丽的状态绘图
public Player(Bitmap im, float x, float y) {
super(im, fsData, 0, 0, x, y, 31, 37, -15, -37);
// 默认初始移动速度为0
vx = vy = 0;
m = 0;
vy1 = 0;
// 定义默认值
PlayerIsDead = false;
ishitUp = false;
isDead = false;
HaveCreate = false;
nextLevel = false;
}
// 创建游戏逻辑方法
public void upData(MC mc, JOY joy, map mp, TXManager tm, DJManager dm,
NPCManager nm) {
this.nextFream();
// 接收参数m判断
if (m < 3) {
x = vx;
// 定义玛丽移动的前提
if (m == 0 || isDead == false || PlayerIsDead == false) {
// 左箭头被点的时候
if (joy.leftdown == true) {
this.f = true;
x -= SPEED;
// 碰撞检测方法
if (mp.isHit(x – 7, y – 18) > 0
|| mp.isHit(x – 7, y – 26) > 0
|| mp.isHit(x – 7, y – 10) > 0) {
x = SPEED;
}
if (x – mc.cx < 0) {
x = SPEED;
}
}
// 右箭头被点
if (joy.rightdown == true) {
this.f = false;
x = SPEED;
// 碰撞检测方法
if (mp.isHit(x 7, y – 18) > 0
|| mp.isHit(x 7, y – 26) > 0
|| mp.isHit(x – 7, y – 10) > 0) {
x -= SPEED;
}
if (x – mc.cx > 250 && mc.cx – 480 < 4318) {
mc.cx = SPEED;
}
}
// 点击退出的方法
// if(joy.quit_down==true)
// {
// // 关闭程序的方法,0是关闭
// System.exit(0);
// }
// 接收参数m的值判断
if (m == 0) {
// 点击上箭头的方法
if (joy.up_down == true) {
m = 1;
vy = -18;
// 状态为跳跃
changeFS(2);
// 此时加入点击音效
MC.sp.play(MC.getSoundId_long(), 1f, 1f, 0, 0, 1);
// 判断是否把位图置反
if (f == false) {
vx = 3;
} else {
vx = -3;
}
}
}
if (x – mc.cx > 250) {
mc.cx = 3;
}
}
}
switch (m) {
case 0:
if (mp.isHit(x, y) <= 0 || mp.isHit(x 5, y) <= 0
|| mp.isHit(x – 5, y) <= 0) {
m = 1;
// 状态为跳跃
this.changeFS(2);
vy = 0;
}
break;
case 1: // 跳跃 重力引擎
y = vy;
vy = 2;
if (vy >= 15) {
vy = 15;
}
if (isDead == false) {
if (y > 400) {
tm.create(1, x 25, 236, 30);
isDead = true;
vx = 0;
}
}
if (vy > 0) {
if (mp.isHit(x, y) > 0 || mp.isHit(x – 5, y) > 0
|| mp.isHit(x 5, y) > 0) {
m = 0;
vx = 0;
// 状态为行走
this.changeFS(1);
y = ((int) y / mp.h) * mp.h 1;
}
} else {
// 与问号碰撞检测的方法
if (mp.isHit(x, y – 37) > 0 || mp.isHit(x – 5, y – 37) > 0
|| mp.isHit(x 5, y – 37) > 0) {
if (mp.isHit(x, y – 37) == 2) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
tm.create(4, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h – 8, 6);// 生成金币特效
tm.create(
3, // 在玩家顶到的位置放置特效砖
((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);
}
// 与砖块碰撞检测方法
if (mp.isHit(x, y – 37) == 3) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
tm.create(5, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);// 生成砖块爆炸碎片
}
// 与有毒的蘑菇碰撞检测方法
if (mp.isHit(x, y – 37) == 13) {
mp.map[((int) y – 37) / mp.h][(int) x / mp.w] = 0;
dm.create(1, ((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h – 16);// 生成毒蘑菇
tm.create(
3, // 在玩家顶到的位置放置特效砖
((int) x / mp.w) * mp.w 8,
(((int) y – 37) / mp.h) * mp.h 8, 5);
}
y -= vy;
y = (((int) y – 37) / 16) * 16 37;
vy = 0;
}
}
break;
case 3:
// 自由下落方法
y = vy;
vy = 2;
// 定义状态为死亡
this.changeFS(3);
if (vy >= 0) {
vy = 0;
m = 4;
}
break;
case 4:
vy = 2;
y = vy;
// 判断并状态为死亡
this.changeFS(3);
if (y > 380) {
isDead = true;
vx = 0;
// 根据第几关判断死亡后该回到第几关
if (MC.CanvasIndex == 40) {
MC.CanvasIndex = 35;
}
if (MC.CanvasIndex == 20) {
MC.CanvasIndex = 15;
}
}
break;
case 5:
break;
}
// 判断是否过关
if (x mc.cx > 4800 && y > 320)
// if(x mc.cx>900)
{
nextLevel = true;
if (nextLevel == true) {
MC.CanvasIndex = 30;
}
}
}
// 碰撞的逻辑
public boolean isHit(float _x, float _y) {
if (Math.abs(x – _x) < 10 && Math.abs(y – _y) < 10) {
return true;
}
return false;
}
}
安卓源码(带报告)39
安卓源码(带报告) · 目录
上一篇安卓APP源码和设计报告——移动书籍交互系统下一篇安卓APP源码和设计报告——体重档案APP(含答辩PPT)
阅读原文