本文转载自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 //音效资源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
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);
}
}
|