一套关于游戏声音的解决方案
来源:互联网 发布:mac版qq怎么匿名 编辑:程序博客网 时间:2024/05/20 19:46
一套关于游戏声音的解决方案
转载自:http://www.eoeandroid.com/thread-49-1-1.html
作者:wangzi
游戏图形及逻辑部分开发完毕,但在音乐和音效的处理上真是费尽周折,好在最后完美解决了,在此共享给大家,共同提高!:)
最开始我使用的是普通的MediaPlayer的方式,但这个方法不适合用于游戏开发,因为游戏里面同时播放多个音效是常有的事,用过MediaPlayer的朋友都该知道,它是不支持实时播放多个声音的,会出现或多或少的延迟,而且这个延迟是无法让人忍受的,尤其是在快速连续播放声音(比如连续猛点按钮)时,会非常明显,长的时候会出现3~5秒的延迟~~-_-!~~
后来查了很多资料,最近在国外一家网站找到了解决方案:SoundPool
代码如下:
//音效的音量
int streamVolume;
//定义SoundPool 对象
private SoundPool soundPool;
//定义HASH表
private HashMap<Integer, Integer> soundPoolMap;
/***************************************************************
* Function: initSounds();
* Parameters: null
* Returns: None.
* Description: 初始化声音系统
* Notes: none.
***************************************************************/
public void initSounds() {
//初始化soundPool 对象,第一个参数是允许有多少个声音流同时播放,第2个参数是声音类型,第三个参数是声音的品质
soundPool = new SoundPool(100, AudioManager.STREAM_MUSIC, 100);
//初始化HASH表
soundPoolMap = new HashMap<Integer, Integer>();
//获得声音设备和设备音量
AudioManager mgr = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
}
/***************************************************************
* Function: loadSfx();
* Parameters: null
* Returns: None.
* Description: 加载音效资源
* Notes: none.
***************************************************************/
public void loadSfx(int raw, int ID) {
//把资源中的音效加载到指定的ID(播放的时候就对应到这个ID播放就行了)
soundPoolMap.put(ID, soundPool.load(context, raw, ID));
}
/***************************************************************
* Function: play();
* Parameters: sound:要播放的音效的ID, loop:循环次数
* Returns: None.
* Description: 播放声音
* Notes: none.
***************************************************************/
public void play(int sound, int uLoop) {
soundPool.play(soundPoolMap.get(sound), streamVolume, streamVolume, 1, uLoop, 1f);
}
需要注意的地方:
1.我测试过,SoundPool只能用于播放音效,因为超过大约5.6秒的声音便播放不出来,而且加载超过大约5.6秒的音效还会导致其它声音播放的问题
2.我查过GOOGLE的SDK文档,里面虽然录入了SoundPool的信息,但没有任何说明,连参数代表什么都没提,我在国外网站看到个别网友说这是测试API,可能会在正式SDK中取消,但至少1.0这个版本是保留了这个方法的,所以大家如果想在G1上开发游戏,随便使用吧~不用担心版本不支持的问题~~
3.关于MediaPlayer循环问题,我发现虽然MediaPlayer有提供自带的setLooping(true/false);这个方法,但在循环的间歇会有明显的停顿,应该是做了重新加载或者某些初始化的操作造成的吧,后来我决定不用它自带的循环函数来做循环,而是使用它的另一个函数:getCurrentPosition(),用它可以检测声音播放的偏移,我让它刚好放完或者快要放完的时候手动seekTo(position);这样就可以规避掉中间停顿的问题~~只不过因为要随时检测,程序效率上会稍微有点降低,为了声音的流畅循环,忍了!代码如下:
if (mMediaPlayer.getCurrentPosition() >= 15800)
{
mMediaPlayer.seekTo(50);
}
- 一套关于游戏声音的解决方案
- 关于游戏声音的解决方案[转]
- Android 游戏声音解决方案
- 关于电脑没有声音的解决方案
- 关于Ubuntu root登录没有声音的解决方案
- 关于Ubuntu root登录没有声音的解决方案
- 关于waveinopen只采集麦克风的声音解决方案 - VC/MFC
- 关于deepin外放有声音,耳机没有声音的奇葩解决方案
- 游戏服务器关于玩家数据的解决方案
- 一套PHP做app接口的解决方案
- 一套PHP做app接口的解决方案
- 一套PHP做app接口的解决方案
- Android 一套完整的 Socket 解决方案
- 一套可扩充的游戏模型系统
- 一套关于 Django 的笔试题
- 关于声音提示的使用
- 关于声音的一些基本知识
- Flash无法导入声音问题的解决方案
- H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(zz)
- Java参数传递详解
- IPC----pipe的使用
- java内存泄露和内存溢出(一)
- 字符 字节
- 一套关于游戏声音的解决方案
- winrar4.2 破解 注册码
- 多媒体之音频audio帖子汇总
- maven 教程一 入门
- DBMS_SPACE包中常用的过程
- ios菜鸟之路:消息推送之badgeNum、右上角小红圈数字不显示问题
- Linux串口设置
- maven 教程二 深入
- 用Android实现推送解决方案