程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(三)讓物體動起來③

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(三)讓物體動起來③

編輯:關於C#

第三種方法,DispatcherTimer動畫,該類型動畫與CompositionTarget動畫類似,是基於界面線程的逐幀動畫,但他與CompositionTarget動畫不同,DispatcherTimer動畫可以輕松的進行參數設置:

xaml界面代碼仍然沿用第一節的,那麼接下來我們在後台代碼中創建相關對象:

Rectangle rect; //創建一個方塊作為演示對象
double speed = 5; //設置移動速度
Point moveTo; //設置移動目標
public Window3() {
 InitializeComponent();
 rect = new Rectangle();
 rect.Fill = new SolidColorBrush(Colors.Red);
 rect.Width = 50;
 rect.Height = 50;
 rect.RadiusX = 5;
 rect.RadiusY = 5;
 Carrier.Children.Add(rect);
 Canvas.SetLeft(rect, 0);
 Canvas.SetTop(rect, 0);
 //定義線程
 DispatcherTimer dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal);
 dispatcherTimer.Tick += new EventHandler(Timer_Tick);
 dispatcherTimer.Interval = TimeSpan.FromMilliseconds(50); //重復間隔
 dispatcherTimer.Start();
}

private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
 moveTo = e.GetPosition(Carrier);
}

private void Timer_Tick(object sender, EventArgs e) {
 double rect_X = Canvas.GetLeft(rect);
 double rect_Y = Canvas.GetTop(rect);
 Canvas.SetLeft(rect, rect_X + (rect_X < moveTo.X ? speed : -speed));
 Canvas.SetTop(rect, rect_Y + (rect_Y < moveTo.Y ? speed : -speed));
}

與上一節的代碼類似,不同的地方其實也就是聲明動畫線程處,共4句:

DispatcherTimer dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal);
dispatcherTimer.Tick += new EventHandler(Timer_Tick);
dispatcherTimer.Interval = TimeSpan.FromMilliseconds(50); 
dispatcherTimer.Start();

第一句申明一個界面計時器DispatcherTimer ,並且設置其線程優先級別為Normal,這是標准設置,你可以根據你自己的需求進行更改,一共10個級別。

第二句注冊Tick 事件,也就是計時器間隔觸發的事件。

第三句設置Tick 事件的間隔,可以有很多方式,我使用的是TimeSpan.FromMilliseconds(),即間隔單位為毫秒。

第四句啟動線程。

是不是很簡單?這樣的話可以很輕松的通過Interval 來控制刷新一個對象屬性的頻率了。接下來我們同樣使用Ctrl+F5來測試一下成果。呵呵,結果和第二種動畫方法是一樣的,存在同樣的問題,因為畢竟兩種動畫的原理是一致的。

那麼到此,三種動態創建動畫的方法都已經詳細介紹過了,大家可能會有種感覺,比較鐘情於第一種WPF/Silverlight推薦的Storyboard動畫,既直觀又方便使用,而且仿佛不易出錯。其實這3種動畫都有它特定的使用場合。

第一種動畫適合創建簡單的對象位移及直接性質的屬性更改(在後面的教程中,我還將更深入的挖掘Storyboard動畫的潛力,動態創建更復雜的基於KeyFrame的關鍵幀動畫)。

第二種動畫適合全局屬性的時時更改,例如我們後面要講到的敵人或NPC以及地圖等全體性的相對位移及屬性更改時就要用到它了。

第三種動畫則非常適合運用在Spirit(角色)的個人動畫中,例如角色的移動,戰斗,施法等動作。

小結:前三節分別講解了Storyboard動畫,CompositionTarget動畫,DispatcherTimer動畫,並橫向分析了不同的場合對應不同的動畫應用模式,這些將是構成WPF/Silverlight游戲引擎的基礎。

下一節我將介紹如何使用DispatcherTimer動畫讓對象活起來,敬請關注。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved