首先,注明:以下的對話,純屬虛構。如有雷同,純屬巧合。
人物介紹: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:
表示包含音頻和/或視頻的控件。
而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