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

WPF/Silverlight 遊戲開發教程(二十七之二):動態障礙物構建核心步驟與 BackgroundWorker 實作

     編輯:關於C語言

構建動態障礙物陣列 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 處理此運算綽綽有餘,同步可刷新頭像面板等任務。

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