之前一篇文章是简略的说了一下,解决用户音乐和应用(或者游戏)音乐冲突的问题,现在我们来一起研究下,如何巧妙地规避微软的规则禁区,然后合理的玩出自己想要的效果。
我先简短的介绍下,在WP上播放背景音乐有2中方法:
1.调用Microsoft.Xna.Framework.Media下的MediaPlayer.Play()方法。实例代码:
1 Song bgs = Song.FromUri("background", new Uri("Sound/坑爹的背景音乐.mp3",UriKind.Relative)); 2 FrameworkDispatcher.Update(); 3 4 MediaPlayer.Play(bgs);
这个方法在当前mango版本能播放种类比较多的音乐文件,据我自己使用的经历,一般.mp3和.wav文件居多,而正好这个方法正好使用起来比较灵活,他有很多可供调用的其他方法。操作起来比较方便,总的来说,表面上看这个方法真的是很好,但是,但是。。。。。。接下来就是最坑爹的事情发生了,这个MediaPlayer和手机里面集成的Zune播放器是共用进程的,坑爹啊!有木有啊!也就是说用户如果是先打开Zune播放器,比如用户先打开手机自带的Zune播放器,播放了一首优美的,有格调的《月XX上》,然后在进入你的游戏(或者应用),然后如果这个时候你如果用这个播放你的背景音乐,那么用户正在播放的音乐会先被停止,可是这一点微软是不允许的,所以我在前一篇博客就先提示了,我们必须先弹出对话框,来问用户,那么好,就算如此做了,还是有一个我们团队曾经遇到的问题,那就是微软有些审核人员(不要认为审核人员都是有一个统一的标准,据我们猜测这个审核估计都是不同的人审核,所以会有不同的标准,虽然大致是一样。。但是总有些非主流)会认为你这样终止了用户的音乐,等到用户退出你的游戏之后,你得复原用户进入你游戏之前的播放音乐的状态,但是就因为这个MediaPlayer是单线条的死脑筋 = =!当你用这个来播放你的背景音乐之后,是根本无法复原到进入你的游戏(或者应用)之前的那首歌,和那个状态。。。简而言之,就是MediaPlayer的播放源文件只有一个,你在代码里面调用和Zune播放器是公用一个系统进程(况且就这么解释吧。。),它只能有一个正在播放的音乐文件。所以,敬告:当提前得知你无需在关闭你的游戏之后去恢复Zune播放器的用户音乐,你可以大胆地使用这个方法, 因为他是标准的播放.MP3文件的首选。
2.调用 Microsoft.Xna.Framework.Audio下的SoundEffect.Play()方法。实例代码:
1Stream stream = TitleContainer.OpenStream("Sound/坑爹的背景音乐.wav");
2 SoundEffect effect = SoundEffect.FromStream(stream); 3 FrameworkDispatcher.Update(); 4 effect.Play();
注意:这个soundeffect是从XNA里面来的,有过XBOX编程经验的大神们不会陌生,他目前只能播放.WAV文件,据内部消息,tango版本之后soundeffect可以播放mp3文件了,这是后话,就目前的形式来说,这个方法不被推荐,甚至在官方规则里面都是禁止,,但是根据经验,审查人员不会查看代码,他们只要一旦听到你的游戏音乐跟用户Zune音乐出现混杂的时候,就会第一时间知道你是用了soundeffect来播放背景音乐,因为MediaPlayer不可能同时播放2个音乐(原因前面说过了。。。)。所以利用这一点规则黑洞,我们可以用soundeffcet来播放背景音乐,又可以很好的保存用户进入游戏之前的那个音乐(因为我们根本没对MediaPlayer做任何毁灭性操作,就算你调用了MediaPlayer.Pasue(),也没关系,在游戏即将退出的时候,你显式地调用一下MediaPlayer.Resume()就行了,哇哈哈哈!)
另外,我推荐SoundEffectInstance这个类来播放音乐,因为他有类似于MediaPlayer那些Pause ,Resume等操作,SoundEffect类可以生出SoundEffectInstance这个“儿子”,具体代码如下:
1 Stream stream = TitleContainer.OpenStream(route); 2 SoundEffect effect = SoundEffect.FromStream(stream); 3 FrameworkDispatcher.Update(); 4 SoundEffectInstance sfi = effect.CreateInstance(); 5 sfi.Play();
所以,总结一下,如果你的游戏无需恢复用户的音乐,那么请使用MediaPlayer,这是官方推荐的,如果你想做的稍微完美一点,去恢复用户的音乐的话,请使用SoundEffectInstance。