win8 开发之旅(13) --webabcd大师,这事你怎么看? 向webabcd大师致敬。

  1. 云栖社区>
  2. 博客>
  3. 正文

win8 开发之旅(13) --webabcd大师,这事你怎么看? 向webabcd大师致敬。

laozhu1124 2016-04-15 13:32:51 浏览959
展开阅读全文

首先,注明:以下的对话,纯属虚构。如有雷同,纯属巧合。

人物介绍:Webabcd大师——江湖人称姓王名磊,微软的mvp(最有价值专家),。net界一等一的高手。小曾——silverlight小白。

时间地点:2012年9月的一天,在一次北京举行的.net爱好者的聚会上。webabcd大师,做了一个关于的silverlight的演讲的以后,与会人员自由交流之时。

首先,大师之所以是大师,不仅仅是因为是在技术水平的登峰造极。而且是因为其做人生修为上的高山仰止。所以,这位大师不知疲倦的解开了小曾这个silverlight小白关于一个win8上打地鼠这个小游戏的16个疑惑。

 小曾:⑴webabcd大师,我要做这个打地鼠的这个游戏,可是没有老鼠的头像,你怎么看?

 webabcd:首先,你如果想不用图片的话,可以用silverlight原生态的语言来画图,silverlight本来就能有画图的功能。象著名的玩具总动员的人物,动画都有一个silverlight版本。当然,一般的初学者用图片等素材替代就可以了。

  小曾:⑵webabcd大师,我看电脑版和其他的移动设备(android,ios)上游戏的都有音效的效果,如果我想这个游戏,有音效的效果,难道用silverlight来编音效的代码。你怎么看?

webacbd:首先:通过源代码来实现音效是非常愚蠢做法。当然,silverlight中播放音效,有它自己的解决法案。通过mediaElement和MediaLength控件来播放。我们参看msdn: 

表示包含音频和/或视频的控件。

  小曾:⑶哦,原来这样啊!我如果要写这个小游戏是不是要写一个老鼠类,可是老鼠这个类最终要显示到页面上去。这么做很烦。webabcd大师,你怎么看?
  webabcd:首先,对你有这种思想,我要批评你,编程不要有怕麻烦的思想。这是必须要做的,当然,你不想这么做,你可以这个老鼠类用一个用户控件来表示了,这样你不用写两个类了。但是,微软这种做法,有它的弊端,就是使人面向对象的思维能力降低了。但是,请您记住,你如果想从一个小菜变成一个大牛的话,最好是用面向对象的来思考,最好是用mvvm的架构来写这个项目。如果你要快速开发的就用做用户控件的方法就可以了。
 小曾:(4)咦,我知道mvc,MVp的设计模式。mvvm。。。,你怎么看?
 webabcd:你知道这些,我还是比较的欣慰。。因为说明你可能有点面向对象的基础,至于你问道的什么是MVVm,他是mvp的一个进化,过去mvc用图是这么表示的:

而MVVM的用图形是这么表示的:

他们的本质都是实现表示层和逻辑代码的解耦,你看这两个图,mvvm中的viewmodel 能够接受来自service的结果,这对于mvc来说更加的灵活。

小曾:⑸我这个打地鼠的游戏怎么用mvvm来架构。

webabcd:大概思路是这样的,你可以抽取两个简单model对象,一个mouse对象,一个HitModel对象,这对应的hitmodel对象接受的service是打击这个方法。 绑定,就绑定这个方法。

小曾:⑹架构我是有了,我们在讨论点xaml的语言的实质点的东西。如果是这个小游戏,一定要做老鼠进洞出洞的动画,你怎么看?

webabcd:这个好办,xaml中提供了一个storyboard的类的就是专门做动画的。

小曾:⑺我一看着storyboard哪些参数就头大,webabcd大师,你怎么看?

webabcd:这些什么头大的,我们先看看微软的解释:

Storyboard 类

为容器的子动画提供对象和属性目标信息的容器时间线。你可能常用到的是他的子类DoubleAnimationUsingKeyFrames,EasingDoubleKeyFrame类,你看看下面的源代码吧

<Storyboard x:Name="sbOutHole">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="mouse" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
<EasingDoubleKeyFrame KeyTime="00:00:00" Value="41">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase EasingMode="EaseInOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="00:00:00.4000000" Value="-93">
<EasingDoubleKeyFrame.EasingFunction>
<BackEase EasingMode="EaseInOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="mouse" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<EasingDoubleKeyFrame KeyTime="00:00:00.4000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>

这段源代码一个老鼠进洞的动画,首先动画的作用于的目标的控件是mouse的这个控件,他改变的值是子控件的y轴的值,动画持续的时间是0.4秒,作用的值是40,他动画的效果是进行动画处理之前略微收回动画的动作。你是不是有一点基本的明白了。

小曾:⑽好,我视乎有点懂了。那我做这个游戏,时候有时会出现这个错误:

错误 1 无法将“Mouse”添加到集合属性“Children”中, 类型必须为“UIElement” C:\Users\admin\Documents\Visual Studio 2012\Projects\ZCWMoleAttack\MoleAttack\Hole.xaml 49 10 MoleAttack ,

webabcd:呃呃呃!这个问题 把ctrl-namespace:变成using 前者是老写法,win8只支持后者。

小曾:⑾我还有个问题要问,win8不支持mouseLeftButtonDown,你怎么看

webabcd:你可以用Tapped事件来替代。

小曾:⑿如果要要用MouseMove事件,你怎么看?

webabcd:你可以用PointerMove事件替代

小曾:⒀在就是,有关算法的问题,如何来进行碰撞检测了,你怎么看?

webabcd:silverlight有个rectangle控件中有个insectwith这个方法,能够判断两个控件是否碰撞。

小曾:⒁对于不同的老鼠随机钻出洞方法,你怎么看?

webabcd:可以用random函数解决了,当然你想要更加的随机的话,new Random(datetime.Now.Millseconds);这样子 产生的随机数更加的随机

小曾:⒂树洞这样的类,你怎么看?

webabcd:树洞这样的类,是非重要的类,可以用用户控件解决,做把做Mouse,hitModel这样的的类添加到这个控件上,交由一个GameMain的用户控件处理相应的逻辑。

小曾:⒃老鼠被打后,得分,你怎么看?

webabcd:这个可以通过一个score事件来实现老鼠被打后,得分的效果。

小曾:谢谢,webabcd大师答疑解惑。

webabcd:不用谢,非常乐意 与他人分享知识吗。

想看看一下他内部的结构吗,请猛击:http://51aspx.com/Code/Win8GophersGame

网友评论

登录后评论
0/500
评论
laozhu1124
+ 关注