最近在做一个android版的连连看小游戏,希望在游戏播放背景音乐以及音效,为此搜寻了相关资料,经过学习研究得出最终解决方案:MediaPlayer+SoundPool。
MediaPlayer 用来控制游戏背景音乐的播放。
SoundPool 播放游戏音效,在初始化时加载游戏中用的所有音效文件,然后在游戏中进行播放,这样声音没有延迟,保证了游戏的性能。最初我还想让背景音乐也使用 SoundPool进行播放,可是经过测试,总是不成功,而且在初始化时会很慢,不知道是不是因为SoundPool不适用较大的音乐文件?
特 别要说的是,我在网上看到有些文章在讲解实现游戏背景音乐的播放时,说要使用service,本人很不赞同。可能是因为大多讲解service的教程都喜 欢用音乐播放器的例子,所以很多人产生了一个误解,认为只要是播放音乐就要用到service。其实人家所说是开发一个音乐播放器,这个播放器需要在系统 后台持续播放歌曲,而不管是用户停留在当前应用界面还是退出到了系统桌面,或是切换到了另一个应用的界面,总之意思是说要在系统后台进行播放,这时必须要 用到service。而一个游戏的背景音乐仅仅需要在游戏运行的时候播放,而在返回到桌面或者进入其他应用使游戏的activity变为不可见时,都应该 立即停止播放,根本没必要使用service。
有人可能说播放背景音乐应该在后台执行,不能影响程序的正常运行,这样说当然正确,但这仅需要开辟 一个单独的线程来专门播放音乐就可以了,而经我测试,MediaPlayer和SoundPool本身都已经实现了在独立的线程中播放音乐,所以综上所述 在游戏中播放背景音乐完全没必要使用service,那样完全是舍近求远,画蛇添足之举。只需直接使用MediaPlayer即可。请看我的代码:
这是一个实现游戏中播放声音的类,封装了MediaPlayer和SoundPool的使用细节,所有方法都定义为静态方法,在程序启动时先调用其init方法,然后在任何地方都可以非常方便的使用
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); } }