本文转载自csdn一篇文章,作者:wyf35429827
最近在做一个android版的连连看小游戏,希望在游戏播放背景音乐以及音效,为此搜寻了相关资料,经过学习研究得出最终解决方案:MediaPlayer+SoundPool。
MediaPlayer 用来控制游戏背景音乐的播放。
SoundPool播放游戏音效,在初始化时加载游戏中用的所有音效文件,然后在游戏中进行播放,这样声音没有延迟,保证了游戏的性能。最初我还想让背景音乐也使用SoundPool进行播放,可是经过测试,总是不成功,而且在初始化时会很慢,不知道是不是因为SoundPool不适用较大的音乐文件?
特别要说的是,我在网上看到有些文章在讲解实现游戏背景音乐的播放时,说要使用service,本人很不赞同。可能是因为大多讲解service的教程都喜欢用音乐播放器的例子,所以很多人产生了一个误解,认为只要是播放音乐就要用到service。其实人家所说是开发一个音乐播放器,这个播放器需要在系统后台持续播放歌曲,而不管是用户停留在当前应用界面还是退出到了系统桌面,或是切换到了另一个应用的界面,总之意思是说要在系统后台进行播放,这时必须要用到service。而一个游戏的背景音乐仅仅需要在游戏运行的时候播放,而在返回到桌面或者进入其他应用使游戏的activity变为不可见时,都应该立即停止播放,根本没必要使用service。
有人可能说播放背景音乐应该在后台执行,不能影响程序的正常运行,这样说当然正确,但这仅需要开辟一个单独的线程来专门播放音乐就可以了,而经我测试,MediaPlayer和SoundPool本身都已经实现了在独立的线程中播放音乐,所以综上所述在游戏中播放背景音乐完全没必要使用service,那样完全是舍近求远,画蛇添足之举。只需直接使用MediaPlayer即可。请看我的代码:
这是一个实现游戏中播放声音的类,封装了MediaPlayer和SoundPool的使用细节,所有方法都定义为静态方法,在程序启动时先调用其init方法,然后在任何地方都可以非常方便的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
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);
}
}
|