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;@Overridepublic 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));}@Overridepublic 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 应用开发】Android游戏音效实现相关推荐

  1. android ble 设备扫描程序,Android应用开发Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备...

    本文将带你了解Android应用开发Android 7.0  BLE scan 问题:程序无错但扫描不到BLE设备,希望本文对大家学Android有所帮助. < 最近在做毕设,需要几周内从头学起 ...

  2. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  3. android落下动画,Android应用开发android 购物车小球掉落动画

    本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助. 先贴效果图 对自定义View小红球的绘制 public class BallView ...

  4. android baseactivity,Android应用开发Android通过BaseActivity获取到当前启动的Activity名称...

    本文将带你了解Android应用开发Android通过BaseActivity获取到当前启动的Activity名称,希望本文对大家学Android有所帮助. < 在BaseActivity的on ...

  5. android view 点击变暗,Android应用开发Android ImageView点击变暗效果

    本文将带你了解Android应用开发Android ImageView点击变暗效果,希望本文对大家学Android有所帮助. < 自定义ImageView: 在ImageView中setPres ...

  6. android 防止重复启动app,Android应用开发Android 防止启动页面(SplashActivity)被多次启动...

    本文将带你了解Android应用开发Android 防止启动页面(SplashActivity)被多次启动,希望本文对大家学Android有所帮助. 话不多说直接上代码: @Override prot ...

  7. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...

    本文将带你了解Android应用开发Android Studio数字签名打包apk图文步骤教程,希望本文对大家学Android有所帮助. Android Studio数字签名打包release版apk ...

  8. android修改用户名和密码错误,Android应用开发Android Studio 修改用户名、密码、URL等操作教程...

    本文将带你了解Android应用开发Android Studio 修改用户名.密码.URL等操作教程,希望本文对大家学Android有所帮助. 修改用户名.密码: 在AndroidStudio的ter ...

  9. android程序突然崩溃如何调试,Android应用开发android 调试崩溃Unable to instantiate application的解决方法...

    本文将带你了解Android应用开发android 调试崩溃Unable to instantiate application的解决方法,希望本文对大家学Android有所帮助. 更新后Android ...

  10. android程序包不存在,Android应用开发Android studio 错误: 程序包 不存在

    本文将带你了解Android应用开发Android studio 错误: 程序包 不存在,希望本文对大家学Android有所帮助. " Android studio 错误: 程序包 不存在 ...

最新文章

  1. android 点击连续拍照,android自定义相机、连续(自动)聚焦、点击(触摸)聚焦、变焦、拍照后自定义裁剪、旋转...
  2. php值传递和java_Java的值传递和引用传递
  3. python重复import_Python module重复载入的问题
  4. Android源码分析--MediaServer源码分析(二)
  5. php与c有什么区别,.c与.cpp文件的一点区别
  6. C#查找指定窗口的子窗口的句柄
  7. 【DevExpress】 SearchLookUpEdit
  8. 【气动学】基于matlab GUI改进的遗传算法和高斯烟羽模型模拟气体扩散【含Matlab源码 1060期】
  9. zblog php 二级菜单,ZblogPHP模版导航栏跟随效果
  10. 青山遮不住——2020的10大技术趋势
  11. matlab里调节触发角度,电机与拖动基础及MATLAB仿真陈亚爱第4章直流电机.ppt
  12. 小甲鱼 P61 IO缓冲区
  13. java零基础风清扬黑马笔记
  14. c语言编程仓鼠吃豆子,动态规划之仓鼠吃豆子 - osc_8quu62cg的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. Strong-Convexity:强凸性
  16. 为什么机器学习对嵌入式开发很重要?
  17. python绘制条形图 中文横坐标_python3使用matplotlib绘制条形图
  18. Ethical.Hacking.2021.10:BUILDING TROJANS
  19. ### Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘user_id‘ cannot be null
  20. Snipaste - 截图贴图软件

热门文章

  1. 高并发之CAS机制和ABA问题
  2. GoldenGate 配置extract,replicat进程自启动
  3. 双绞线网线的连接方式
  4. [导入]web2.0中流行的设计元素:颜色
  5. SpringCloud学习(七)高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
  6. Python_logging模块
  7. 一个有关ajax去获取天气预报然后用echarts展现出来的小demo
  8. 存储过程学习笔记(SQL数据库
  9. hive的Specified key was too long; max key length is 767 bytes问题解决
  10. 高效代码审查:来自前质疑者的9个建议