C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(三十三) 錦上添花之魔法特效裝飾
本節我將以凍結魔法為例,向大家講解如何為魔法增加漂亮的特效裝飾。
經過前面的學習,大家是否已總結出一個規律:需要增加額外東西時,首先想到的即是用戶控件;那麼我們首先創建一個名為QXDecoration的用戶控件。接下來就是准備素材了。這裡我制作了3張用於裝飾的冰刺:
分別命名為4-0,4-1,4-2,其命名規則對應上一節中的魔法類型設定,即所有冰凍類魔法均可以用之來裝飾。為什麼要使用3張呢?其實一張就已足夠了,只是效果上每個精靈被凍結後將一模一樣;而通過隨機從這3張中抽取1張用於裝飾凍結效果將大幅度增加畫面的生動性,在大量精靈同時被凍結的情況下產生一種宏大的氣勢感;另外,如果您能通過Blend畫出一個類似的冰刺,那麼基於矢量的裝飾物將可以任意的拉伸及變化,表現出來的效果會更加逼真與貼切。
都准備好後,代碼實現起來是很簡單的,首先將配置寫進Config.XML:
<Decoration Code="4" Num="3" Duration="2" CenterX="40" CenterY="60"></Decoration>
接下來只需在魔法觸發傷害幀時將對應的魔法效果裝飾附加到被攻擊對象的腳底即可:
……
//附加特效裝飾
if (magic.DecorationCode != -1 && canvas.FindName(string.Format("Decoration{0}", enemy.Name)) == null) {
LoadXElement(string.Format("Decoration{0}", magic.DecorationCode.ToString()), GetTreeNode(SystemConfig, "Decoration", "Code", magic.DecorationCode.ToString()));
XElement DecorationData = GetXElement(string.Format("Decoration{0}", magic.DecorationCode.ToString()));
Random rm = new Random();
QXDecoration decoration = new QXDecoration() {
BodySource = getImage(string.Format("Decoration/{0}-{1}.png", magic.DecorationCode, rm.Next((int)DecorationData.Attribute("Num") - 1))),
CenterX = (double)DecorationData.Attribute("CenterX"),
CenterY = (double)DecorationData.Attribute("CenterY"),
X = enemy.X,
Y = enemy.Y,
Duration = (double)DecorationData.Attribute("Duration"),
};
canvas.RegisterName(string.Format("Decoration{0}", enemy.Name), decoration);
canvas.Children.Add(decoration);
}
……
上一節中的冰凍只是減緩對象精靈的各種速度,那麼本節為了演示,我將之改為了凍結效果,類似於麻痺。因此該凍結裝飾的消失分兩種情況:一是在凍結時間歸0時被移除;另一種為被凍結精靈死亡後移除,相關邏輯我寫在源碼中,這裡就不羅列了。
來一張效果圖吧: