首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

WPF/Silverlight 遊戲開發教程(二十五之四):HitTest 精準捕獲精靈實作

     編輯:關於C語言

在上一節中,我們已經建立了 HitFilter 與 HitResult 兩個回呼方法,它們是 VisualTreeHelper.HitTest 控制流程的核心。每次命中測試執行完畢後,必須呼叫 HitTestResultBehavior.Continue 才能繼續向視覺樹更深層遞迴搜尋。

核心回呼實作

public HitTestResultBehavior HitResult(HitTestResult result)
{
    return HitTestResultBehavior.Continue;
}

HitFilter 負責篩選命中物件,HitResult 則決定是否繼續遞迴。兩者定義完成後,便可在視窗的滑鼠移動事件中執行實際的命中測試:

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);
            }
        }
    }
}

流程解析

每次滑鼠移動時,必須先清空精靈容器 SpiritList,然後取得滑鼠在載體 CarrIEr 中的座標,以此為參數發起點擊測試。經過 HitFilter 與 HitResult 過濾後,所有位於滑鼠位置的精靈會被收集進容器。接著遍歷容器內的每個精靈,只有當該點真正落在精靈 Canvas 的有效實體區域內,才算成功捕獲。一旦捕獲,立即將滑鼠游標切換為 1 號(發光游標)並跳出迴圈。這裡透過 label3 顯示捕獲到的精靈名稱,方便驗證準確度。

實測結果

在地圖密集區域放置 30 個擁有不同名稱的怪物精靈,移動滑鼠分別捕獲,label3 顯示的名稱與滑鼠所指精靈完全一致。此方法實現極其精確高效,堪比衛星定位:

至此,完整的 HitTest 精準捕獲精靈流程已告一段落。下一節將進入戰鬥系統的建構,敬請期待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved