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

WPF/Silverlight 遊戲開發教程(二十五之三):定義有效實體區域與 HitTest 介紹

     編輯:關於C語言

上一節提到的逐像素顏色拾取法雖然精確,但缺點明顯:僅限 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 的偏移量,一個怪物數百張圖片將極大增加開發負擔。

HitTest——穿透點擊的神器

WPF/Silverlight 中最不起眼卻極其強大的 HitTest(命中測試) 正式登場。稱之為「穿透點擊」更貼切:它能抓取視窗中任意深度的物件,甚至肢解封裝控件直接取得內部元素,效能極高,幾乎可忽略不計。

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 與完整捕獲邏輯。

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