`
endual
  • 浏览: 3509451 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 背景音乐

 
阅读更多

最近在做一个android版的连连看小游戏,希望在游戏播放背景音乐以及音效,为此搜寻了相关资料,经过学习研究得出最终解决方案:MediaPlayer+SoundPool。
MediaPlayer 用来控制游戏背景音乐的播放。
SoundPool 播放游戏音效,在初始化时加载游戏中用的所有音效文件,然后在游戏中进行播放,这样声音没有延迟,保证了游戏的性能。最初我还想让背景音乐也使用 SoundPool进行播放,可是经过测试,总是不成功,而且在初始化时会很慢,不知道是不是因为SoundPool不适用较大的音乐文件?

特 别要说的是,我在网上看到有些文章在讲解实现游戏背景音乐的播放时,说要使用service,本人很不赞同。可能是因为大多讲解service的教程都喜 欢用音乐播放器的例子,所以很多人产生了一个误解,认为只要是播放音乐就要用到service。其实人家所说是开发一个音乐播放器,这个播放器需要在系统 后台持续播放歌曲,而不管是用户停留在当前应用界面还是退出到了系统桌面,或是切换到了另一个应用的界面,总之意思是说要在系统后台进行播放,这时必须要 用到service。而一个游戏的背景音乐仅仅需要在游戏运行的时候播放,而在返回到桌面或者进入其他应用使游戏的activity变为不可见时,都应该 立即停止播放,根本没必要使用service。
有人可能说播放背景音乐应该在后台执行,不能影响程序的正常运行,这样说当然正确,但这仅需要开辟 一个单独的线程来专门播放音乐就可以了,而经我测试,MediaPlayer和SoundPool本身都已经实现了在独立的线程中播放音乐,所以综上所述 在游戏中播放背景音乐完全没必要使用service,那样完全是舍近求远,画蛇添足之举。只需直接使用MediaPlayer即可。请看我的代码:

这是一个实现游戏中播放声音的类,封装了MediaPlayer和SoundPool的使用细节,所有方法都定义为静态方法,在程序启动时先调用其init方法,然后在任何地方都可以非常方便的使用

Java code
package com.llkan.setup; import java.util.HashMap; import java.util.Map; import java.util.Random; import com.llkan.R; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.SoundPool; /** * 声音控制类 * @author wyf * */ public class SoundPlayer { private static MediaPlayer music; private static SoundPool soundPool; private static boolean musicSt = true ; // 音乐开关 private static boolean soundSt = true ; // 音效开关 private static Context context; private static final int [] musicId = {R.raw.bg,R.raw.bg1,R.raw.bg2,R.raw.bg3}; private static Map < Integer,Integer > soundMap; // 音效资源id与加载过后的音源id的映射关系表 /** * 初始化方法 * @param c */ public static void init(Context c) { context = c; initMusic(); initSound(); } // 初始化音效播放器 private static void initSound() { soundPool = new SoundPool( 10 ,AudioManager.STREAM_MUSIC, 100 ); soundMap = new HashMap < Integer,Integer > (); soundMap.put(R.raw.itemboom, soundPool.load(context, R.raw.itemboom, 1 )); soundMap.put(R.raw.sel, soundPool.load(context, R.raw.sel, 1 )); } // 初始化音乐播放器 private static void initMusic() { int r = new Random().nextInt(musicId.length); music = MediaPlayer.create(context,musicId[r]); music.setLooping( true ); } /** * 播放音效 * @param resId 音效资源id */ public static void playSound( int resId) { if (soundSt == false ) return ; Integer soundId = soundMap.get(resId); if (soundId != null ) soundPool.play(soundId, 1 , 1 , 1 , 0 , 1 ); } /** * 暂停音乐 */ public static void pauseMusic() { if (music.isPlaying()) music.pause(); } /** * 播放音乐 */ public static void startMusic() { if (musicSt) music.start(); } /** * 切换一首音乐并播放 */ public static void changeAndPlayMusic() { if (music != null ) music.release(); initMusic(); startMusic(); } /** * 获得音乐开关状态 * @return */ public static boolean isMusicSt() { return musicSt; } /** * 设置音乐开关 * @param musicSt */ public static void setMusicSt( boolean musicSt) { SoundPlayer.musicSt = musicSt; if (musicSt) music.start(); else music.stop(); } /** * 获得音效开关状态 * @return */ public static boolean isSoundSt() { return soundSt; } /** * 设置音效开关 * @param soundSt */ public static void setSoundSt( boolean soundSt) { SoundPlayer.soundSt = soundSt; } /** * 发出‘邦’的声音 */ public static void boom() { playSound(R.raw.itemboom); } }
分享到:
评论
1 楼 endual 2012-04-28  
http://topic.csdn.net/u/20120111/22/f00e8f1e-6331-488a-926f-2d491fe95f12.html

相关推荐

Global site tag (gtag.js) - Google Analytics