C#開發WPF/Silverlight動畫及遊戲系列
三、新增功能:
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;
}
用了兩節的時間進行了本教程示例遊戲從WPF向Silverlight平臺的移植的關鍵點講解,當然細節的最佳化還有非常多,原始碼釋出後大家應該都能理解,因此這裡也不累述了。後面的教程均將在此Silverlight引擎的基礎上進行全新演義,下一節首先講解的是如何製作遊戲中的小地圖,敬請關注。
作者:深藍色右手
出處:http://alamiye010.cnblogs.com/
教程目錄及原始碼下載:點選進入(歡迎加入WPF/Silverlight小組 WPF/Silverlight部落格團隊)
本文版權歸作者和部落格園共有,歡迎轉載。但未經作者同意必須保留此段宣告,且在文章頁面顯著位置給出原文連線,否則保留追究法律責任的權利。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2812151/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#開發WPF/Silverlight動畫及遊戲系列教程(Game Course):(三)讓物體動起來③C#動畫遊戲GAM
- WPF and Silverlight 學習筆記(一):開發環境及參考資料筆記開發環境
- Silverlight C# 遊戲開發:Balder的3D世界C#遊戲開發3D
- Silverlight及WPF中實現自定義BusyIndicatorIndicator
- C#泡泡堂遊戲開發全套系列C#遊戲開發
- Silverlight C# 遊戲開發:Flyer08用Blend做一個新遊戲C#遊戲開發
- iOS開發 - 動畫實踐系列iOS動畫
- Silverlight/WPF/Windows Phone 開發之MVVM設計模式之入門WindowsMVVM設計模式
- C#微信開發系列教程C#
- Silverlight遊戲開發:引擎”Night”解析遊戲開發
- Android 5.0+ 高階動畫開發系列 向量圖動畫Android動畫
- 直接操作遊戲物件C#遊戲開發物件C#遊戲開發
- C#開發Unity遊戲教程迴圈遍歷做出判斷及Unity遊戲示例C#Unity遊戲
- 【譯】闖入遊戲開發 #5:動畫遊戲開發動畫
- Silverlight Project開發Project
- WPF簡單動畫實現動畫
- 使用libgdx開發Android遊戲(2)——動畫Android遊戲動畫
- [C# 開發技巧系列]使用C#操作Word和Excel程式C#Excel
- WPF3D立方體圖形展開動畫思路3D動畫
- WPF閃爍預警動畫的控制元件製作及winform呼叫WPF控制元件的方法動畫控制元件ORM
- Silverlight的開發工具
- WPF備忘錄四(事件動畫)事件動畫
- Silverlight 遊戲開發小技巧:技能冷卻效果1(Cooldown)遊戲開發
- 緩動公式整理(附:C#實現及WPF原版對比)公式C#
- 一個Wpf的開發框架框架
- 如何開發一款遊戲:遊戲開發流程及所需工具遊戲開發
- 三維圖形及動畫軟體開發流程 (轉)動畫
- WPF loading載入動畫庫動畫
- 微信小遊戲開發(4)-動畫和觸控事件遊戲開發動畫事件
- Transform元件C#遊戲開發快速入門ORM元件C#遊戲開發
- C#貪吃蛇(WPF版)C#
- ios開發學習–動畫(Animation)效果原始碼分享–系列教程1iOS動畫原始碼
- 使用MVVM Toolkit簡化WPF開發MVVM
- C# 10動畫C#動畫
- SuperMap iClient for Silverlight開發準備client
- Flutter 掌握動畫開發Flutter動畫
- 遊戲發展史:《全面戰爭》系列(1):開端遊戲
- WPF 後臺程式碼做 TranslateTransform 的動畫ORM動畫