已經能完美捕捉想要的精靈了,但是如何讓被捕獲的精靈進行特效顯示呢?目前的網絡游戲中最常用的方式有兩種:1、對被捕獲的精靈進行描邊;2、讓被捕獲的精靈半透明化。
第一種方法的實現需要首先為精靈控件中的身體部分控件添加一個WPF專有的OuterGlowBitmapEffect效果:
<Image x:Name="Body" Stretch="Fill">
<Image.BitmapEffect>
<OuterGlowBitmapEffect GlowColor="Blue" GlowSize="5" Noise="0" Opacity="1" />
</Image.BitmapEffect>
< /Image>
具體意思就是在精靈身體圖片不透明區域進行外發光:藍色,5像素寬,無噪音,完整透明度。其運行效果如下圖:
看到這張圖的時候或許大家開始有些欣喜若狂了,但是我想告訴大家:此方法絕對的行不通,為什麼?一方面此方法只能在WPF中使用,它的原理是時時動態查找圖片不透明區域的邊緣,然後對邊緣路徑進行發光濾鏡處理;而另一方面由於它是對圖片源不透明區域進行時時的邊緣查找,將極大的占用游戲的界面線程資源,是極其不友好的表現方式。
因此,為了同時適應WPF/Silverlight,我使用第二種方法作為最終解決方案。這種方法實現起來簡單多了,只需要在前面代碼的基礎上加進行如下更改:
private void Window_MouseMove(object sender, MouseEventArgs e) {
……
if (SpiritList.Count > 0) {
bool targetIsFound = false;
for (int i = 0; i < SpiritList.Count; i++) {
if (!targetIsFound && isEfficaciousSection(SpiritList[i].EfficaciousSection, e.GetPosition(SpiritList[i]))) {
this.Cursor = Super.getCursor(1);
SpiritList[i].Opacity = 0.6;
targetIsFound = true;
label3.Content = SpiritList[i].Name;
} else {
if (!targetIsFound) { this.Cursor = Super.getCursor(0); }
SpiritList[i].Opacity = 1;
}
}
}
}
在鼠標移動事件中僅僅增改6行代碼即可以輕松的實現,運行效果如下:
到此為止即完美實現了對精靈的精確捕獲。忽忽,是不是感覺向完整的游戲框架目標又邁出了一大步?
在此,我還想對那些極端的朋友說一下:由於目前暫時采用多線程結構,在單核CPU電腦以及Win2003以前的操作系統上運行時,怪物密集的地方會有些卡。但是這根本代表不了游戲引擎的最終性能,教程還有非常非常多的內容沒有講到,優化的技術還在後面呢,太多了就不一一羅列了,大家應該都明白本系列既然取名為教程,代表的就是一個由淺入深的過程,很多人連基礎原理都沒弄清楚,源碼對你有何意義?
小結:HitTest功能強大到幾乎無所不能,它是我們實現打怪與施放魔法的前提條件。下一節我將講解精靈面板界面,以及精靈3大基本屬性(生命、魔力、經驗值)表現形式的實現方法,敬請關注。