相信好多人都玩过汤姆猫这个小游戏,要做这个小游戏其实也不难,这不,现写一个,先看效果演示。

tom.gif

目前实现的主要功能点包括以下两部分:

戳 tom 的各个身体部位它会做出相应反馈,包括动作和声音。

往右滑动屏幕的时候另外一只黄色的小狗跳出来搞怪,并发出怪声。

鉴于我不知道这只黄色的狗子叫啥名字,后面的内容里我就称呼它为小黄吧。效果图听不见声音感觉有点无趣,所以我打了个安装包,想安装体验的可以扫码下载。

qr_tomcat.png

思路分析

我们先来分析一下这个小游戏的实现思路,首先是动作效果,不管是汤姆还是小黄所做的动作,其实就是一个逐帧动画,也就是将动画拆分为帧的形式,每一帧也就是一张图片,然后按序播放一组预先定义好的图片,就像播放一卷电影一样。声音效果就很简单了,在动作发生时播放音效即可。

这篇文章就分两部分讲吧,一部分是用手指戳汤姆,另一部分是小黄出来搞怪。

一、戳汤姆

1. 确定点击位置

我们点击汤姆时其实是点击了一些透明的按钮,透明效果只需要给控件alpha属性设置为0即可,如下图所示我们分别给汤姆的脚,肚子,尾巴和左右脸放置了按钮点击。

layout.png

2. 逐帧动画

逐帧动画就是加载一系列可绘制资源来创建动画,需要在xml文件的 animation-list 元素中使用 item 子元素定义动画的全部帧,并指定各帧的持续时间即可。

第一步

在/res/drawable目录下,定义一个逐帧动画的xml资源文件,如下

android:drawable="@drawable/breath_0001"

android:duration="200"/>

android:drawable="@drawable/breath_0002"

android:duration="200"/>

android:drawable="@drawable/breath_0003"

android:duration="200"/>

android:drawable="@drawable/breath_0004"

android:duration="200"/>

android:drawable="@drawable/breath_0005"

android:duration="200"/>

android:drawable="@drawable/breath_0006"

android:duration="200"/>

这里每一个item就是一帧,drawable设置动画图片资源,duration设置一帧持续的时间(ms)。

第二步

播放逐帧动画,如下

layout_animation.setBackgroundResource(R.drawable.breath);

AnimationDrawable anim = (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

SoundPool pool = new SoundPool(3, AudioManager.STREAM_MUSIC, 1);//同时播放最大数量 类型 音质

可以看到SoundPool的构造函数中有三个参数,SoundPool(int maxStreams, int streamType, int srcQuality),各参数如下

参数maxStreams:指定支持多少个声音,也就是同时播放最大数量。

参数streamType:指定声音类型。

参数srcQuality:指定声音品质。

(2) 加载声音

得到SoundPool对象之后,就可调用SoundPool的load()方法来加载声音。load()方法有四个重载,返回值都是该声音的ID,如下

//1.通过资源ID加载声音。

int load(Context context, int resld, int priority)

//2.通过FileDescriptor加载 offset开始、长度为length的声音。

int load(FileDescriptor fd, long offset, long length, int priority)

//3.通过一个AssetFileDescriptor对象所对应的文件中加载声音

int load(AssetFileDescriptor afd, int priority)

//4.通过指定的路径加载。

int load(String path, int priority)

我们把声音文件放在res下的raw文件中,所以使用第一个重载load()方法,第一个参数是上下文,第二个参数就是我们的音频资源ID,第三个参数是声音的优先级。如下代码所示:

pool.load(this, R.raw.fart003_11025, 1);

(3) 播放声音

SoundPool提供了play()方法播放指定声音,有六个参数,如下:

int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);

参数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等,咱们的重点在于讲解这个游戏的实现原理,这里我就只介绍第一种监听了。

首先手指滑动的时候会先按下,滑到另一个地方再抬起,我们就可以根据按下的坐标和抬起的坐标算出是往哪一个方向滑动了,如下代码所示。

@Override

public boolean onTouchEvent(MotionEvent event) {

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) {//向左滑

} else if (x2 - x1 > 50) {//向右滑

//小黄开始出来搞怪

}

}

return super.onTouchEvent(event);

}

怎么用c语言写汤姆猫小游戏,Android实现汤姆猫小游戏相关推荐

  1. 汤姆猫java下载手机版_汤姆猫编程星球app下载-汤姆猫编程星球下载v1.0.8-西西软件下载...

    汤姆猫编程星球是一款少儿编程教育软件,帮助想学习编程少年快速学习,多彩多样的玩法,锻炼孩子的思维性,逻辑性,从小时候就加强大脑的锻炼,喜欢的朋友可以在西西下载使用. 软件介绍 汤姆猫编程星球介绍和汤姆 ...

  2. 除了 Python ,这些语言写的机器学习项目也很牛

    全世界只有3.14 % 的人关注了 数据与算法之美 Python 由于本身的易用优势和强大的工具库储备,成为了在人工智能及其它相关科学领域中最常用的语言之一.尤其是在机器学习,已然是各大项目最偏爱的语 ...

  3. 猫和老鼠汤姆看java_猫和老鼠:盘点汤姆5种超越认知的形态,最后一种“痛不欲生”!...

    动画片<猫和老鼠>可以说是许多人童年时的经典,各种搞笑的剧情深受小朋友们的喜爱.动画中主要讲述的是汤姆猫和杰瑞鼠之间的故事.猫为了能够抓到老鼠,想尽了千方百计,而每一次都还是让老鼠逃走.当 ...

  4. 用C语言写PHP扩展

     用C语言写PHP扩展 1:预定义 在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def 内容是你希望定义的函数名以及参数: int a(int x,int y) s ...

  5. 看看现在大型网站都是用什么语言写的 ?

    看看现在大型网站都是用什么语言写的 ? 不排除一个网站用多种技术!如淘宝是Java + php,底层是java,表现层是php.新浪,网易,腾讯应该也是用了多种技术. 据说是这样的:php,新浪,雅虎 ...

  6. 会写代码的AI开源了!C语言写得比Codex还要好,掌握12种编程语言丨CMU

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 比Codex还 ...

  7. 大学生只会用C语言写简单的计算怎么办?

    大学生会用C语言写几个简单的计算太正常了,有些人直到毕业了都写不出什么程序. 这个也是大多数应届生的一个现状. 在学校的时候不知道要好好学习,等马上会接受社会毒打时才发现自己一无是处,然后开始临时抱佛 ...

  8. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  9. C语言写一函数交换两变量的值

    C语言写一函数交换两变量的值 #include <stdio.h> void swap(int *p1, int *p2); // 形参,只声明 int main(){int a=5, b ...

  10. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

最新文章

  1. SQL2005中利用PIVOT实现分组统计
  2. Entity Framework 学习笔记(1)
  3. gslang——原生golang/RPC描述语言简介
  4. 剑桥毕业之后创业的可能的在商学院的出路
  5. OpenCASCADE:Inspector的TInspectorEXE 示例
  6. 如何证明CRM WebClient UI上的应用是有状态(Stateful)的
  7. 对vue虚拟dom的研究
  8. oracle10g-创建表空间 用户
  9. Android近场通信---NFC基础(二)(转)
  10. iis mysql_Windows10本地搭建IIS+PHP+MYSQL+phpMyAdmin运行环境图文教程(也可用于服务器)...
  11. 算法的概念与伪代码的使用
  12. 数据包接收系列 — NAPI的原理和实现
  13. 网络篇 使用Visio来画流程图(进阶篇)-01.1
  14. 《Go语言实战》William Kennedy中文版学习笔记
  15. 【安装配置】DirectAdmin安装Nginx方法
  16. QT 水晶圆角按钮样式
  17. 关于博客的自定义皮肤
  18. Extraneous non-emits event listeners (onJump) were passed to component but could not be automaticall
  19. iOS操作系统的层次架构和相关服务
  20. 一款免费的截图、滚动截屏软件

热门文章

  1. [译]How browsers work
  2. 前端处理订单支付超时
  3. python缺失值处理 fillna_python 处理缺失值
  4. 小酌重构系列[12]——去除上帝类
  5. 回程路由 的作用 为什么 什么时候需要回程路由
  6. 关于不登陆微信如何傻瓜式查看记录
  7. Conflux人物志 | Péter明哲 Marcel马驰
  8. 如何占用计算机大量内存,windows7内存占用率高如何处理_win7电脑内存占用过高怎么办...
  9. python3 tkinter 出现_tkinter.TclError: can’t invoke “destroy” command: application has been destroyed
  10. 牛郎织女都见面,而你却在吃狗粮---男士星座脱单指南