其中RadiusX與RadiusY分別定義激光魔法的圓角,並通過BitmapEffect中的OuterGlowBitmapEffect為激光魔法添加外發光效果(此特效很不錯,可是會占用大量的界面線程資源第二十五節中有提到過相關知識;值得慶幸的是,在Silverlight中此類特效效果及性能均表現優良,有興趣的朋友不妨在Silverlight中測試體驗一下),此時大家是否有注意到,我還為該激光魔法添加了一個RotateTransform,因為它與上一節中的群攻魔法有一定的區別,它是具有方向的,因此我們需要通過旋轉變換來實現相關需求。這裡我為其旋轉對象取了個名字Rotate以方便後台代碼能對其進行操作。
界面繪制好後,我們還需要為控件添加一些屬性,這些屬性與上一節中的魔法控件的屬性基本相同;需要特別指出的是Fill與OuterFill這兩個屬性,它們分別用來設置激光魔法內部的填充及外發光顏色。
接下來還需要在Config.XML文件中為激光魔法設定參數:
<Magic Type="1" Code="6" FrameNum="20" EffectiveFrame="0">
……
< /Magic>
這裡我新加了一個參數叫Type,用它來區分不同類型的魔法,因為不同類型的魔法它的范圍、方向、傷害處理等均存在非常大的差異,我們必須分類進行處理。
最後,我們通過仿造類似上一節的魔法處理代碼,即可將激光魔法運行起來。但是又出現了新的問題:由於激光屬於矩形直線穿梭類型魔法,在傷害計算上會有些特殊,該如何進行相關的設定呢?大家不妨先看下圖:
當我們點擊B點時,激光魔法將從主角的手位置點A發出,接著我們通過計算獲得B與A之間的角度,並對激光魔法按此角度進行旋轉,最後得到觸發傷害的范圍即為上圖中粉色點陣所包圍的區域;在已知點A與點B的坐標,以及激光魔法的長度,我們可以很簡單的計算出激光魔法傷害范圍其不規則矩形的4個頂點坐標,從而我們可以通過System.Drawing命名空間中的相應方法來循環判斷地圖中的精靈是否在該不規則矩形內來對其進行傷害處理:
/// <summary>
/// 判斷點是否在多邊形內
/// </summary>
/// <param name="range">多邊形頂點范圍</param>
/// <param name="target">要判斷的點</param>
public static bool PointInPolygon(System.Drawing.Point[] range, System.Drawing.Point target) {
System.Drawing.Drawing2D.GraphicsPath myGraphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
System.Drawing.Region myRegion = new System.Drawing.Region();
myGraphicsPath.Reset();
myGraphicsPath.AddPolygon(range);
myRegion.MakeEmpty();
myRegion.Union(myGraphicsPath);
return myRegion.IsVisible(target);
}