android游戏源码(Android实现汤姆猫小游戏)
android游戏源码(Android实现汤姆猫小游戏)
相信好多人都玩过汤姆猫这个小游戏,要做这个小游戏其实也不难,这不,现写一个,先看效果演示。
tom.gif
目前实现的主要功能点包括以下两部分:
戳 tom 的各个身体部位它会做出相应反馈,包括动作和声音。
往右滑动屏幕的时候另外一只黄色的小狗跳出来搞怪,并发出怪声。
鉴于我不知道这只黄色的狗子叫啥名字,后面的内容里我就称呼它为小黄吧。
思路分析我们先来分析一下这个小游戏的实现思路,首先是动作效果,不管是汤姆还是小黄所做的动作,其实就是一个逐帧动画,也就是将动画拆分为帧的形式,每一帧也就是一张图片,然后按序播放一组预先定义好的图片,就像播放一卷电影一样。声音效果就很简单了,在动作发生时播放音效即可。这篇文章就分两部分讲吧,一部分是用手指戳汤姆,另一部分是小黄出来搞怪。
一、戳汤姆1. 确定点击位置
我们点击汤姆时其实是点击了一些透明的按钮,透明效果只需要给控件alpha属性设置为0即可,如下图所示我们分别给汤姆的脚,肚子,尾巴和左右脸放置了按钮点击。
layout.png
2. 逐帧动画逐帧动画就是加载一系列可绘制资源来创建动画,需要在xml文件的 animation-list 元素中使用 item 子元素定义动画的全部帧,并指定各帧的持续时间即可。
第一步在/res/drawable目录下,定义一个逐帧动画的xml资源文件,如下
<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@drawable/breath_0001"android:duration="200"/><itemandroid:drawable="@drawable/breath_0002"android:duration="200"/><itemandroid:drawable="@drawable/breath_0003"android:duration="200"/><itemandroid:drawable="@drawable/breath_0004"android:duration="200"/><itemandroid:drawable="@drawable/breath_0005"android:duration="200"/><itemandroid:drawable="@drawable/breath_0006"android:duration="200"/></animation-list>
这里每一个item就是一帧,drawable设置动画图片资源,duration设置一帧持续的时间(ms)。
第二步播放逐帧动画,如下
layout_animation.setBackgroundResource(R.drawable.breath);AnimationDrawableanim=(AnimationDrawable)layout_animation.getBackground();anim.setOneShot(true);//是否播放一次if(anim.isRunning()){//如果动画已经播放过anim.stop();//停止动画}//启动动画anim.start();
这里很简单,直接使用AnimationDrawable类的start()方法即可启动逐帧动画,另外通过setOneShot()方法可以设置是否循环一次,为true将循环一次,然后停止并保持最后一帧。如果设置为false,则动画将一直循环。
3. 播放声音Android中除了MediaPlayer播放音频之外,还提供了SoundPool来播放音效,SoundPool使用音效池的概念来管理多个短促的音效,适用于短且对反应速度比较高的情况(游戏音效或按键声等),所以我们选择SoundPool来给汤姆和小黄加音效。
(1) 实例化SoundPool
SoundPoolpool=newSoundPool(3,AudioManager.STREAM_MUSIC,1);//同时播放最大数量类型音质
可以看到SoundPool的构造函数中有三个参数,SoundPool(int maxStreams, int streamType, int srcQuality),各参数如下
参数maxStreams:指定支持多少个声音,也就是同时播放最大数量。
参数streamType:指定声音类型。
参数srcQuality:指定声音品质。
(2) 加载声音得到SoundPool对象之后,就可调用SoundPool的load()方法来加载声音。load()方法有四个重载,返回值都是该声音的ID,如下
//1.通过资源ID加载声音。intload(Contextcontext,intresld,intpriority)//2.通过FileDescriptor加载offset开始、长度为length的声音。intload(FileDescriptorfd,longoffset,longlength,intpriority)//3.通过一个AssetFileDescriptor对象所对应的文件中加载声音intload(AssetFileDescriptorafd,intpriority)//4.通过指定的路径加载。intload(Stringpath,intpriority)
我们把声音文件放在res下的raw文件中,所以使用第一个重载load()方法,第一个参数是上下文,第二个参数就是我们的音频资源ID,第三个参数是声音的优先级。如下代码所示:
pool.load(this,R.raw.fart003_11025,1);
(3) 播放声音SoundPool提供了play()方法播放指定声音,有六个参数,如下:
intplay(intsoundID,floatleftVolume,floatrightVolume,intpriority,intloop,floatrate);
参数soundID:指定播放哪个声音,也就是上面load()方法返回的声音ID。
参数leftVolume、rightVolume:指定左、右声道的音量。
参数priority:指定播放声音的优先级,数值越大,优先级越高。
参数loop:指定是否循环,0:不循环,-1:循环,其他值表示要重复播放的次数。
参数rate:指定播放的比率,数值可从0.5到2, 1为正常比率。
当需要播放声音时,则调用play()方法即可,如下代码所示:
pool.play(soundId,1,1,1,0,1);//声音id,左声道,右声道,优先级,循环,速率二、小黄搞怪
这里我们设定了右滑屏幕小黄跑出来搞怪,其原理和戳汤姆是一样的,同样是播放逐帧动画和播放声音,只是我们触发这个事件的方式不同,当然你也可以写成戳他眼睛鼻子耳朵或者左滑下滑上滑让小黄出来搞怪,这里我就只介绍一下监听手势滑动的方法。监听手势滑动可以利用Activity的ontouchEvent()方法或手势滑动监听器OnGestureListener等,咱们的重点在于讲解这个游戏的实现原理,这里我就只介绍第一种监听了。
首先手指滑动的时候会先按下,滑到另一个地方再抬起,我们就可以根据按下的坐标和抬起的坐标算出是往哪一个方向滑动了,如下代码所示。
@OverridepublicbooleanonTouchEvent(MotionEventevent){if(event.getAction()==MotionEvent.ACTION_DOWN){//当手指按下的时候x1=event.getX();y1=event.getY();}if(event.getAction()==MotionEvent.ACTION_UP){//当手指离开的时候x2=event.getX();y2=event.getY();if(x1-x2>50){//向左滑}elseif(x2-x1>50){//向右滑//小黄开始出来搞怪}}returnsuper.onTouchEvent(event);}
- 1bat的大数据(BAT的大数据来源)
- 2三星s8屏幕上端2(三星s8屏幕上端2个按键)
- 3三星屏幕坏了如何导出(三星屏幕摔坏了如何导出数据么)
- 4红米3x怎么关闭自动更新(红米k40s怎么关闭自动更新)
- 5微信上防止app自动下载软件怎么办(微信上防止app自动下载软件怎么办啊)
- 6押镖多少钱(押镖一个月有多少储备金)
- 7瑞星个人防火墙胡功能(瑞星个人防火墙协议类型有哪些)
- 8cf现在等级是多少(cf等级2020最新)
- 9老滑头多少条鱼(钓鱼老滑头有什么用)
- 10WPS自动调整语法(wps如何修改语法)
- 11dell控制面板防火墙(dell的防火墙怎么关闭)
- 12丑女技能升多少(丑女技能需要满级吗)
- 13智能家居系统怎么样(智能家居系统好吗)
- 14戴尔屏幕(戴尔屏幕闪烁)
- 15y85屏幕信息(vivoy85息屏显示时间怎么设置)
- 16魅蓝note3屏幕出现方格(魅蓝note屏幕竖条纹)
- 17v8手指按屏幕(触屏手指)
- 18金为液晶广告机(液晶广告机lb420)
- 19三星显示器怎么校色(三星显示器 调色)
- 20hkc显示器dvi音频(hkc显示器有音响么)
- 21康佳液晶智能电视机(康佳液晶智能电视机怎么样)
- 22做液晶画板电脑(做液晶画板电脑怎么操作)
- 23液晶屏极化现象原理(液晶屏极化现象原理是什么)
- 24企业网络安全防火墙(企业网络防护)
- 256splus黑屏屏幕不亮(苹果6s plus屏幕突然黑屏)
- 26充电导致屏幕失灵(充电导致屏幕失灵怎么办)
- 27超极本屏幕旋转(笔记本电脑屏幕旋转,怎么转过来?)
- 28igmp防火墙(防火墙配置ipv6)
- 29荣耀王者多少经验(王者荣耀经验多少一级)
- 30lol老将还剩多少(qg老将)