上一節提到的逐像素顏色拾取法雖然精確,但缺點明顯:僅限 WPF 使用、效能不佳、且必須包裹在 try-catch 區塊中,因為精靈圖片切換極快,極易拋出例外。本節介紹另一種解決方案——定義精靈實體區域參數 EfficaciousSection,此法兼容 WPF 與 Silverlight,也是筆者推薦的做法。
EfficaciousSection 為一個包含 4 個數值的陣列:new double[] { 左, 右, 上, 下 }。以圖示為例,EfficaciousSection = new double[] { 80, 125, 50, 145 },意指紅色有效區域左邊距圖片左側 80px、右邊距左側 125px、上邊距頂部 50px、下邊距頂部 145px。此紅色區域即為精靈的有效實體區域,滑鼠進入此區域時才切換游標。

擁有有效區域參數後,修改視窗滑鼠移動事件:
if (e.Source is QXSpirit)
{
QXSpirit Spirit = e.Source as QXSpirit;
Point p = e.GetPosition(Spirit);
if (p.X >= Spirit.EfficaciousSection[0] && p.X <= Spirit.EfficaciousSection[1]
&& p.Y >= Spirit.EfficaciousSection[2] && p.Y <= Spirit.EfficaciousSection[3])
{
this.Cursor = Super.getCursor(1);
}
else
{
this.Cursor = Super.getCursor(0);
}
}
執行後發現怪象:滑鼠停在主角身上卻未切換游標。原因在於怪物圖片遮擋住主角,系統判定捕獲的是「絕對無敵」怪物,而滑鼠未進入其有效區域,故游標維持 0 號。
有人建議將圖片裁剪至剛好包裹有效區域。但這會導致每幀圖片尺寸不一,動作切換時需逐幀定義相對 Canvas 的偏移量,一個怪物數百張圖片將極大增加開發負擔。
WPF/Silverlight 中最不起眼卻極其強大的 HitTest(命中測試) 正式登場。稱之為「穿透點擊」更貼切:它能抓取視窗中任意深度的物件,甚至肢解封裝控件直接取得內部元素,效能極高,幾乎可忽略不計。

List<QXSpirit> SpiritList = new List<QXSpirit>();
public HitTestFilterBehavior HitFilter(DependencyObject dObject)
{
if (dObject is QXSpirit)
{
SpiritList.Add(dObject as QXSpirit);
}
return HitTestFilterBehavior.Continue;
}
HitFilter 只篩選 QXSpirit 型別物件並加入容器,回傳 Continue 繼續向下遞迴。下一節將完成 HitResult 與完整捕獲邏輯。