[置顶]暂别之前先写点有用的
posted @ 2012-02-14 15:32 FreeWingInSky 阅读(27) 评论(0) 编辑
posted @ 2012-02-14 15:32 FreeWingInSky 阅读(27) 评论(0) 编辑
之前一篇文章是简略的说了一下,解决用户音乐和应用(或者游戏)音乐冲突的问题,现在我们来一起研究下,如何巧妙地规避微软的规则禁区,然后合理的玩出自己想要的效果。
我先简短的介绍下,在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文件了,这是后话,就目前的形式来说,这个方法不被推荐,甚至在官方规则里面都是禁止,详情请点击http://msdn.microsoft.com/en-us/library/hh184838(v=VS.92).aspx,但是根据经验,审查人员不会查看代码,他们只要一旦听到你的游戏音乐跟用户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。
posted @ 2012-02-20 15:41 FreeWingInSky 阅读(42) 评论(0) 编辑
快要结束5个月的windows phone 7的开发旅程,走之前想写点有用的给各位奋战在WP7开发一线的大神们一点茶余饭后的笑料吧。。。
首先我要声明一点,我只是个菜鸟,文章有偏颇之处请见谅。也欢迎广大微软派系的程序员能为我的文章纰漏之处给予批评。。。这就开始了~~~
开发环境我就不罗嗦了,网上一大堆,但是我得先说一声,如果您想通过把自己的产品放到微软的market place 去挣钱的话,请您最好先去http://create.msdn.com/zh-CN/home/getting_started这里去查阅相关资料。我这里只能阐述我力所能及的代码级别的问题,其余关于商业的问题,我也不是很明白。。。
另外还有一点个人建议,所有想通过移动开发挣钱的纯个人开发者(无团队无风投),最好不要单一的学习silverlight for windows phone,如果你想挣钱XNA是首选。
其余就不多说了。
首先我要先分享的是一个关于音乐播放类的问题,这个问题纠结了我们团队很长时间,我们一直在跟微软的官方规则做斗争,这种斗争是无聊的,但是作为弱势一方的码农们又是必须去面对和解决的,微软的恶心规定如下(PS:这是个隐形条理,这也是在我们在工作中总结出来的活性条理,那个死板的官方规则里面没写明白):
1.用户如果打开了手机自带的Zune播放器,并且播放着音乐进入你的应用(或者游戏),如果你的应用也有背景音乐的时候,你就必须关闭你自己的背景音乐,或者你可以弹出一个对话框,询问用户:“检测到您有音乐在播放,是否暂停您的音乐,播放本游戏的音乐?”,然后就按照用户的选择,如果用户允许,你就停掉用户的音乐,如果用户没允许,那么你的音乐就得“去死”。
解决方案:a.判断用户音乐是否正在播放,如果在播放那么就弹出对话框,让用户去选择(吐槽:玩个游戏还要选来选去,这个规则真蛋疼。。。)
步骤1:在你应用的start page中的后台代码中,重写onnavigateto这个事件:
1 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
2 {
3 if (MediaPlayer.State == MediaState.Playing)
4 {
5 MessageBoxResult rt = MessageBox.Show("是否暂停您的音乐,而播放游戏的背景音乐?", "提示:", MessageBoxButton.OKCancel);
6 if (rt == MessageBoxResult.OK)
7 {
8 MediaPlayer.Pause();
9 //这里用来播放你自己的音乐。
10 //(这里依然会有很多值得商榷的细节,我会在下一篇文章中说明)
11 }
12 else
13 {
14 //这里最好存一下,用户的选择,我建议有必要做成就问一次,以后再也不问。然后在游戏里面添加设置项,是否下次进来还问。
15 }
16 }
17 base.OnNavigatedTo(e);
18 }
解决方案:b.直接只要用户进入你的游戏是带着音乐,那么你就乖乖关闭你的背景音乐,这样也可以。
if (MediaPlayer.State == MediaState.Playing)
{
//关闭你自己的音乐
}
这个简单,但是用户体验会有所下降。这是音乐播放的第一步应该注意的,这是规则。隔天我会再详细介绍如何控制自己的音乐。
第一次在博客园发博,实在是因为现在已经去了别的项目,但是不忍心学了这么久的WP开发,就此荒废。。。在此感谢@纳米咖啡 和@anytao
两位将我引入WP7的世界,尽管我们“深受其害”,痛并快乐着。。。
posted @ 2012-02-14 15:32 FreeWingInSky 阅读(27) 评论(0) 编辑