構建動態障礙物陣列 VaryObstruction 三步驟:拷貝固定障礙物淺表副本 → 遍歷索敵區域精靈標記佔據區域 → 定時重複更新。
1. 建立輔助執行緒與後台工作者
AuxiliaryThread = new DispatcherTimer(DispatcherPriority.Normal);
AuxiliaryThread.Tick += AuxiliaryThread_Tick;
AuxiliaryThread.Interval = TimeSpan.FromMilliseconds(1000);
AuxiliaryThread.Start();
BackWorker = new BackgroundWorker();
BackWorker.DoWork += BackWorker_DoWork;
BackWorker.RunWorkerCompleted += BackWorker_RunWorkerCompleted;
2. 輔助執行緒啟動異步處理
private void AuxiliaryThread_Tick(object sender, EventArgs e)
{
if (!BackWorker.IsBusy) BackWorker.RunWorkerAsync();
}
3. 定義工作委派與刷新邏輯
delegate void WorkDelegate();
private void RefreshFace()
{
VaryObstruction = (byte[,])FixedObstruction.Clone();
for (int i = 0; i < CarrIEr.Children.Count; i++)
{
if (CarrIEr.Children[i] is QXSpirit)
{
QXSpirit spirit = CarrIEr.Children[i] as QXSpirit;
if (spirit != Leader)
{
int x = (int)(spirit.X / GridSizeX);
int y = (int)(spirit.Y / GridSizeY);
for (int m = x - spirit.HoldWidth; m <= x + spirit.HoldWidth; m++)
for (int n = y - spirit.HoldHeight; n <= y + spirit.HoldHeight; n++)
VaryObstruction[m, n] = 0;
}
}
}
}
private void BackWorker_DoWork(object sender, DoWorkEventArgs e)
{
this.Dispatcher.BeginInvoke(new WorkDelegate(RefreshFace), DispatcherPriority.Normal, null);
}
RefreshFace 重置動態障礙物為固定值,再遍歷所有非主角精靈,依 HoldWidth/HoldHeight 標記佔據格為 0(障礙)。BackgroundWorker 處理此運算綽綽有餘,同步可刷新頭像面板等任務。