win8 開發之旅(13) --webabcd大師,這事你怎么看? 向webabcd大師致敬。


首先,注明:以下的對話,純屬虛構。如有雷同,純屬巧合。

人物介紹: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM