[Teaching] [Silverlight] 30秒快速建立遊戲迴圈 (Game Loop)

如果你想拿Silverlight開發遊戲,不管是在PC上採用Silverlight 3、4,或是Windows phone 7上採用Silverlight for windows phone,都離不開先建立一個遊戲迴圈 (Game Loop)。

一般開發應用程式,通常都是採用事件驅動,當有任何按鈕被按下,或是資料被更新時,觸發相對應的程式,開始進行處理。

而遊戲的開發,則採用了時間驅動,在固定的時間內,自動觸發程式碼,來處理各項工作。

這是由於遊戲必須不斷偵測及改變畫面上的各項物件變化,因此必須要在固定的時間內,重新針對所有畫面上的元素,以及使用者輸入的訊號,做一次檢核。

那為什麼遊戲不能採用事件驅動來開發呢? 事實上,並不是不能採用事件驅動來開發,而是得看的遊戲類型和規模是不是適合不必建立遊戲迴圈 (Game Loop)。

簡單來說,如果你的遊戲並沒有不斷變動位置或是狀態的AI角色,或是需要即時偵測的輸入指令,例如你想做一個丟骰子的遊戲,或是抽牌比大小的遊戲,是可以考慮不建立任何額外的遊戲迴圈 (Game Loop)。

那甚麼時候該使用遊戲迴圈 (Game Loop)呢? 假使有50個NPC需要同時移動到不同的位置,產生不同的動作,並且除了該NPC被消滅,否則他都會一直隨機的變換位置和隨機動作,這時候你就需要一個遊戲迴圈 (Game Loop),來處理這些NPC了。

Silverlight 中建立遊戲迴圈 (Game Loop)的方式有非常多種,可參考下列文章:

http://blogs.msdn.com/b/nikola/archive/2009/08/19/exposed-5-methods-to-create-game-loop-which-is-the-best.aspx

今天,我將介紹兩個非常簡單的方式,透過StoryBoard和Silverlight 4中的新行為CallMethodAction建立遊戲迴圈 (Game Loop)

 

Silverlight 3、Windows phone 7

在Silverlight 3和Windows phone 7中,我們將建立一個StoryBoard當作計時器,透過Duration來設定每一個迴圈執行的時間,通常遊戲會以每秒能處理多少張數或是格數來計算,在Silverlight 中由於並不是真正每次都重新繪製圖型,所以並沒有很明確的張數或格數的概念,但我們不妨還是採用這樣的概念來進行設計,假設是要每秒30的fps,那Duration就必須設定為0.033秒更新一次。

而StoryBoard中有一個Completed事件,當Completed時執行程式碼,就可以透過StoryBoard來達成遊戲迴圈 (Game Loop)的效果,實作方式如下。

 

1. 首先透過Blend建立一個StoryBoard

image

 
2. 建立完成後,可以先不作任何動作,就按下關閉。

image

 
3. 建立ControlStoryboardAction行為

image

 

4. 設定ControlStoryboardAction。透過ControlStoryboardAction行為,讓StoryBoard在載入後可以自動Begin

image

 

5. 透過xaml碼,設定StoryBoard的Duration和Completed

image

 

6. 在.cs中,會出現對應的方法,在這裡頭就可以寫入遊戲的更新邏輯。

image

 

Silverlight 4

在Silverlight 4中多了一個CallMethodAction行為。我們可以透過這個行為,搭配TimerTrigger,同樣可以達到遊戲迴圈 (Game Loop)的效果,實作方式如下。

 

1. 先在.cs內寫一個方法。

image

 

2. 設定CallMethodAction行為

image

 

3. CallMethodAction預設的Triggertype是eventTrigger,我們需要將它變更為TimerTrigger

image

 

4. 設定TimerTrigger

image

 

5. 設定TimerTrigger的MillisecondsPerTick,也就是多少毫秒要觸發,以每秒30fps來說,就是每隔0.033秒要觸發,換算為毫秒則是33毫秒。

image

 

6. 最後設定MethodName和TargetObject,TargetObject請設為該Usercontrol。

image

B+ StudioCopyright © 2010 B+ Studio.

posted on 2010-08-30 11:07  B+  阅读(307)  评论(0编辑  收藏  举报

导航