首先,注明:以下的對話,純屬虛構。如有雷同,純屬巧合。
人物介紹: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:這些什麼頭大的,我們先看看微軟的解釋:
為容器的子動畫提供對象和屬性目标資訊的容器時間線。你可能常用到的是他的子類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">
</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"/>
</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:不用謝,非常樂意 與他人分享知識嗎。