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

iDotNetSpace發表於2009-07-08

第三種方法,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動畫讓物件活起來,敬請關注。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608605/,如需轉載,請註明出處,否則將追究法律責任。

相關文章