C#開發WPF/Silverlight動畫及遊戲系列

25minutes發表於2021-09-09

三、新增功能:

1)新增遊戲的音樂及音效物件:

public static MediaElement gameMusic, gameAudio;

2)新增遊戲滑鼠游標:

//設定遊戲滑鼠游標

GameCursor.Stretch = Stretch.Fill;

GameCursor.Source = Super.GetImage("/Image/Cursor/0.png");

在滑鼠移動事件中根據命中測試進行時時的滑鼠游標圖片位置更新:

//滑鼠移動(懸停)事件

private void Game_MouseMove(object sender, MouseEventArgs e) {

……

Point p = e.GetPosition(Root);

GameCursor.SetValue(Canvas.LeftProperty, p.X); GameCursor.SetValue(Canvas.TopProperty, p.Y);

……

}

此方法實現了滑鼠圖片跟隨游標移動,但是很明顯的影響了程式整體效能(CPU消耗會明顯增加),如果哪位朋友能提供更好的解決方案,望留言給我。

3)新增點選水滴:

當滑鼠在螢幕上左鍵點選時,只要不點到物件物體上,則在該位置顯示出游標水滴,並播放它自身的動畫。目前我的Silverlight遊戲引擎中只用一個游標水滴:

QXDecoration hitCursor;

///

/// 載入游標點選水滴

///

private void LoadHitCursor() {

        hitCursor = new QXDecoration() {

           Code = 1,

           EndFrame = 9,

           CenterX = 32,

           CenterY = 32,

         };

         hitCursor.Visibility = Visibility.Collapsed;

         Add(hitCursor);

}

//滑鼠左鍵事件

private void Game_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

……

        //出現游標水滴

        hitCursor.Visibility = Visibility.Visible;

        hitCursor.FrameCounter = 0;

        hitCursor.Timer.Start();

        hitCursor.Coordinate = p;

……

}

 

圖片描述

如果您想最求更漂亮的點選效果,那麼只需每次滑鼠左鍵點選時建立新的水滴即可:

private void Game_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

……

//出現游標水滴

QXDecoration hitCursor = new QXDecoration() {

      Code = 1,

      EndFrame = 9,

      CenterX = 32,

      CenterY = 32,

};

Add(hitCursor);

hitCursor.Coordinate = p;

}

圖片描述

四、360度極光型別魔法的製作及使用方法

大家在看Demo演示時,是否會對那個極光魔法充滿興趣與好奇。它不僅僅是動畫的,而且可以360度隨意旋轉,且傷害範圍為一個不規則矩形區域,而這所有的一切的原始素材僅為我製作的一張圖片而已,下面我將為大家演示它的整個製作流程。

首先我們畫出該魔法向X軸正向的圖片:

圖片描述

神奇的動畫效果就要出現啦,接下來每隔5個色相儲存一張圖片:

圖片描述

最後儲存出8張圖片,並按順序定義好名字:

圖片描述

    素材準備工作完成,下面是邏輯上的實現。該極光魔法同樣透過QXMagic來建立例項,當點選滑鼠右鍵時,我們首先獲取滑鼠右鍵點選點的座標,然後根據方法將之延長到攻擊距離。再根據公式計算出直角座標系下實際應該旋轉的角度Angle

///

/// 根據兩點商值計算角度

///

/// y2-y1

/// x2-x1

/// 直角座標系角度

    public static double GetAngle(double y, double x) {

           return Math.Atan2(y, x) / Math.PI * 180;

}

然後還需要對極光魔法物件進行旋轉處理:

magic.RenderTransform = new RotateTransform() {

       CenterX = 0,

       CenterY = (double)magicData.Attribute("CenterY"),

       Angle = magic.Angle

}

其中CenterY將該魔法發射點及旋轉中心定位到施法者中心,即手的部位;施法時以該中心為旋轉軸進行旋轉。這裡還有個小技巧,即在製作鐳射魔法圖片時,我特意在鐳射頭部與圖片左邊邊緣留下一段距離,這樣做可以不需要額外的程式碼即可以實現從手的前端發射出魔法處進行旋轉,而不是從身體中心進行旋轉發射:

圖片描述

圖片描述

接著確定傷害區域,該區域為一個時時的不規則矩形區域。處理時我將360二維空間劃分為斜4象限,即45度到135度和-135度到-45度這兩個象限為一個傷害區域、其他角度為另外的傷害區域,那麼最後得到的公式如下:

        ///

        /// 根據45度斜四象限獲取矩形四個頂點(直線穿梭魔法用)

        ///

        /// 旋轉角度

        /// 矩形中線起點

        /// 矩形中線終點

        /// 矩形中線與邊距離

        /// 四個頂點

        public static Point[] GetRectRange(double angle, Point start, Point end, int radius) {

            if ((angle >= 45 && angle = -135 && angle

                return new Point[]{

                    new Point(start.X - radius, start.Y),

                    new Point(start.X + radius, start.Y),

                    new Point(end.X + radius, end.Y),

                    new Point(end.X - radius, end.Y),

                };

            } else {

                return new Point[]{

                    new Point(start.X, start.Y - radius),

                    new Point(start.X, start.Y + radius),

                    new Point(end.X, end.Y + radius),

                    new Point(end.X, end.Y - radius),

                };

            }

        }

這樣做公式簡單,省掉了對每個頂點的獲取及旋轉變換。

最後透過判斷所有在螢幕中的敵對精靈座標是否處於該矩形區域內進行傷害處理:

        ///

        /// 判斷點是否在多邊形內(射線法)

        ///

        /// 目標點

        /// 多邊形各頂點

        ///

        public static bool InPolygon(Point target, Point[] range) {

            int n = 0, count = 0;

            for (int i = 0; i

                n = (i == range.Length - 1) ? 0 : n + 1;

                if ((range[i].Y != range[n].Y) && (((target.Y >= range[i].Y) && (target.Y = range[n].Y) && (target.Y

                    count++;

                }

            }

            return (count % 2 > 0) ? true : false;

        }

    用了兩節的時間進行了本教程示例遊戲從WPFSilverlight平臺的移植的關鍵點講解,當然細節的最佳化還有非常多,原始碼釋出後大家應該都能理解,因此這裡也不累述了。後面的教程均將在此Silverlight引擎的基礎上進行全新演義,下一節首先講解的是如何製作遊戲中的小地圖,敬請關注。

圖片描述作者:深藍色右手
出處:http://alamiye010.cnblogs.com/
教程目錄及原始碼下載:點選進入(歡迎加入WPF/Silverlight小組 WPF/Silverlight部落格團隊)
本文版權歸作者和部落格園共有,歡迎轉載。但未經作者同意必須保留此段宣告,且在文章頁面顯著位置給出原文連線,否則保留追究法律責任的權利。

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

相關文章