我正试图在我的应用程序上播放背景音乐,以及在你杀死敌人时偶尔播放的音效。
所有的音效都起作用了,但后来我开始使用MusicManager类(类似于本教程:http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion)尝试播放背景音乐,效果很好,但音效在半秒钟左右后就被剪掉了。
我正在使用播放音效
MediaPlayer mp = MediaPlayer.create(context, R.raw.fire);
mp.start();
请改用声池。SoundPool可以同时以不同的音量、速度和循环播放多个流。MediaPLayer并不是真正用来处理游戏音频的。
我在市场上发布了两款游戏,都使用SoundPool,没有任何问题。
在这里,这两个函数直接从我的游戏中删除。
public static void playSound(int index, float speed)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, speed);
}
public static void playLoop(int index, float speed)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / 3f;
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);
}
这就是它的简单之处。仔细观察一下,我只使用我的playLoop()来播放背景音乐,所以我降低了音量,但你可以很容易地修改代码,每次播放时手动设置音量。
还有
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);
第一个参数mSoundPoolMap.get(index)只是一个包含我所有声音的容器。我给每个声音分配一个最后的数字,比如
final static int SOUND_FIRE = 0, SOUND_DEATH = 1, SOUND_OUCH = 2;
我把这些声音加载到这些位置,然后从中播放。(记住,你不想每次运行一个都加载所有的声音,只需加载一次。)接下来的两个参数是左/右音量、优先级,然后-1设置为循环。
mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
这使我的声音池有8条溪流。另一个是源类型,然后是质量。
玩得开心!