每執行一次過濾器後,我們必須重復以上過程繼續向更深層次進行捕獲,因此在HitTest結果HitResult中執行繼續操作以供向下個節點輪循:
public HitTestResultBehavior HitResult(HitTestResult result) {
return HitTestResultBehavior.Continue;
}
HitFilter和HitResult是HitTest中控制流程非常重要的參數,定義完它兩後接下來我們在窗體的鼠標移動事件中進行如下HitTest命中測試:
private void Window_MouseMove(object sender, MouseEventArgs e) {
SpiritList.Clear();
Point p = e.GetPosition(CarrIEr);
VisualTreeHelper.HitTest(
CarrIEr,
new HitTestFilterCallback(HitFilter),
new HitTestResultCallback(HitResult),
new PointHitTestParameters(p));
if (SpiritList.Count > 0) {
for (int i = 0; i < SpiritList.Count; i++) {
if (isEfficaciousSection(SpiritList[i].EfficaciousSection, e.GetPosition(SpiritList[i]))) {
this.Cursor = Super.getCursor(1);
label3.Content = SpiritList[i].Name; //調試用
break;
} else {
this.Cursor = Super.getCursor(0);
}
}
}
}
每次鼠標移動的時候我們必須清空精靈容器,然後對鼠標當前的點在CarrIEr中的位置進行點擊測試,通過前面的HitFilter和HitResult過濾後得到所有位於鼠標位置的精靈放進容器,然後遍歷精靈容器裡的所有精靈,只有當該點位於精靈Canvas裡的位置處於精靈的有效實體區域時,才算真正的捕獲到了精靈。一旦捕獲到了精靈則同時更改鼠標光標為1號光標然後退出循環;這裡我為了測試是否精確的捕獲了精靈對象,設置了名叫label3的文本來顯示抓取到的精靈名字。
到此就完成了整個HitTest精確捕獲精靈流程,下面我在地圖密集的區域內添加30個擁有不同的名字的怪物精靈,然後嘗試移動鼠標去分別捕獲,通過label3中的名字顯示該方法實現起來是極其准確的,比衛星定位還要精確與高效^_^||: