1. 游戏音效SoundPool

游戏中会根据不同的动作 , 产生各种音效 , 这些音效的特点是短暂(叫声,爆炸声可能持续不到一秒) , 重复(一个文件不断重复播放) , 并且同时播放(比如打怪时怪的叫声 , 和技能释放的声音需要同时播放) , 即时(技能用处之后声音马上随着玩家操作发出,不能有延迟).

MediaPlayer会占用大量的系统资源 , 并且不能同时播放 , 并且无法实现即时音效 , 这里引入了一个新的类 -- SoundPool , 这个类完全满足上面提出的四点要求 , 可以无延时播放游戏中的短暂音效 .

2. 相关API介绍

(1) SoundPool

构造方法 : SoundPool(int maxStreams, int streamType, int srcQuality) ;

参数解析 :

maxStream : 该参数是定义最多能同时播放的多少音效 .

streamType : 该参数定义音频类型 , 游戏中一般设置为AudioManager.STREAM_MUSIC .

srcQuality : 该参数用来设置音频质量 , 这个参数目前没有作用 , 这里设置为 0;

加载音频文件方法 : int load(Context context, int resId, int priority);

参数解析 :

context : 上下文对象;

resId : 要加载的资源文件 , 即R.raw.music...

priority : 优先级别 , 这里没有作用 , 设置为1.

播放音效方法 : int play(int soundId, float leftVolume, float rightVolume, int priority, int loop, float rate);

参数解析 :

soundId : 这个id不是资源id , 指的是利用load方法加载资源文件返回的id值 , 这个要区别清楚.

leftVolume : 左声道的音量 , 这个音量是一个 0 ~ 1的数 , 这个小数是当前音量/最大音量的结果;

rightVolume : 右声道的音量 , 这个音量与左声道的音量是同一种音量;

priority : 优先级参数 , 0为最低, 这里设置为1;

loop : 音效循环的次数 , 0为不循环 , -1为永远循环;

rate : 音效回放的速度 , 这个值是在0.5~2.0f之间 , 1f是正常速度;

暂停音效播放方法 : pause(int streamId);

参数streamId : 这个参数是play()方法执行完之后的返回值 , 这个返回值是正在播放的音效的一个标识 , 对正在播放的音效进行操作的时候 , 就需要这个标识来对其进行操作;

通知音效播放方法 : stop(int streamId) , 这个参数与上面的pause()方法中的streamId参数是一个效果.

(2)AudioManager

获取方法 : AudioManager对象时系统服务, 可以通过调用上下文对象的getSystemService(Context.AUDIO_SERVICE)获取 , 注意获取到之后 , 需要将对象墙砖为AudioManager对象才可以使用.

eg : AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

利用AudioManager获取当前音量的方法 : float currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

利用AudioManager获取当前系统最大音量方法 : float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

使用这两个音量就可以计算出运行SoundPool音效的音量 , 当前音量 / 系统最大音量 , 结果就是soundPool.play()方法中需要传入的音量 ;

3. 程序代码

public class MainActivity extends Activity implements OnClickListener {

	private SoundPool soundPool;
private HashMap<Integer, Integer> hashMap;
private int currStreamId; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initSoundPool();
} private void initSoundPool() {
soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
hashMap = new HashMap<Integer, Integer>();
hashMap.put(1, soundPool.load(getApplicationContext(), R.raw.musictest, 1));
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_play:
play(1, 0);
Toast.makeText(getApplicationContext(), "播放即时音效", Toast.LENGTH_LONG).show();
break;
case R.id.bt_stop:
soundPool.stop(currStreamId);
Toast.makeText(getApplicationContext(), "暂停播放", Toast.LENGTH_LONG).show();
break;
default:
break;
}
} private void play(int sound, int loop) {
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
float currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = currVolume / maxVolume;
currStreamId = soundPool.play(hashMap.get(sound), volume, volume, 1, loop, 1.0f);
System.out.println(currStreamId);
}
}

4. 程序的注意点

  • 音效文件需要放在res的raw下.
  • SoundPool播放的音效要小于7秒 , 否则会出现加载失败的现象;
  • 在Android平台上使用的即时文件越小越好 , 必要的时候可以降低采样频率或者将立体声改为单声道;

Android游戏音效实现的更多相关文章

  1. 【Android 应用开发】Android游戏音效实现

    1. 游戏音效SoundPool 游戏中会根据不同的动作 , 产生各种音效 , 这些音效的特点是短暂(叫声,爆炸声可能持续不到一秒) , 重复(一个文件不断重复播放) , 并且同时播放(比如打怪时怪的 ...

  2. 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

    在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...

  3. 八款常见的Android游戏引擎

    原文地址:http://bbs.csdn.net/topics/380203732 1.Angle  Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL  ...

  4. Android游戏与应用开发最佳学习路线图

    Android 游戏与应用开发最佳学习路线图 为了帮助大家更好的学习 Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家. 一.路线图概括: 二.具体需要掌握知识点: 三. ...

  5. 记录一下八款开源 Android 游戏引擎

    记录一下八款开源 Android 游戏引擎 虽然android学了点点,然后现在又没学了(我为啥这么没有恒心呢大哭).以后有时间还是要继续学android的,一定要啊!虽然现在没学android游戏编 ...

  6. [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...

  7. 八款开源 Android 游戏引擎 (巨好的资源)

    转载地址:http://software.intel.com/zh-cn/blogs/2012/01/13/android-4 初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道 ...

  8. Android 八款开源 Android 游戏引擎

    原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...

  9. Android游戏开发基本知识

    Android游戏开发 手机游戏被业内人士称为继短信之后的又一座金矿.Android虽然基于Java,但是其虚拟机是基于寄存器的,速度得到了很大的提升,这为Android平台上开发游戏提供了坚强的后盾 ...

随机推荐

  1. node 版本升级,版本管理,版本切换

    查看node版本 node -v 升级步骤 1,清除node缓存 sudo npm cache clean -f 2,安装n模块 sudo npm install -g n 3,升级到稳定版本 sud ...

  2. Java : java基础(6) 反射与枚举

    类需要经过 加载, 连接, 初始化三个步骤来进行初始化. 加载是把class文件读入内存创建一个class对象, 连接分为三步,第一步是验证是否是正确的结构, 第二步是准备, 为类的静态成员分配内存, ...

  3. checked和unchecked转换

    static unsafe void Main(string[] args) { unchecked //checked 运行时候引发异常 { int n = int.MaxValue; n++; C ...

  4. 中国软件大会上大快搜索入选中国数字化转型TOP100服务商

    大快搜索自荣获“2018中国大数据企业50强”殊荣,12月20日在由工信部指导,中国电子信息产业化发展研究院主办的2018中国软件大会上,大快搜索获评“2018中国大数据基础软件领域领军企业”称号,入 ...

  5. day2-exercise

    # Author: 刘佳赐-Isabelle October 22,2018 """ 1.有变量name = "aleX leNb" 完成如下操作: ...

  6. P2P通讯

    转载: http://www.cnblogs.com/pannengzhi/p/4800526.html http://blog.csdn.net/lee353086/article/details/ ...

  7. 【8086汇编-Day3】用debug做实验时的技巧与坑

    Ⅰ· 无病呻吟 学一门语言,不动手实验是学不好的,在实验中不断遇坑然后解决,才有进益.所以写一下我在第一次汇编实验中的所思所想(王爽<汇编语言>第二章章末实验). Ⅱ · 实验内容 题解思 ...

  8. react路由按需加载方法

    使用router4之后以前的按需加载方法require.ensure 是不好使了. 所以我们改用react-loadable插件做按需加载. 第一步: yarn add react-loadable ...

  9. 免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践

    免考final linux提权与渗透入门--Exploit-Exercise Nebula学习与实践 0x0 前言 Exploit-Exercise是一系列学习linux下渗透的虚拟环境,官网是htt ...

  10. 成都优步uber司机第一组与第二组的区别

    成都优步uber司机被分成了两组,两组的奖励方式不相同,下面我们先来看看官方给出的奖励方式: 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最 ...