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

C# 開發 WPF/Silverlight 動畫與遊戲系列教程(十六)完美移動系統最終章(二)—— A* 關鍵幀動畫核心改造細節

     編輯:關於C語言

A* 移動方法核心改造

private void AStarMoveTo(Point p) {
    int start_x = GameSystemX;
    int start_y = GameSystemY;
    Start = new System.Drawing.Point(start_x, start_y);
    int end_x = (int)p.X / GridSize;
    int end_y = (int)p.Y / GridSize;
    End = new System.Drawing.Point(end_x, end_y);

    if (path == null) { /* 路徑不存在 */ }
    else {
        ......
        DoubleAnimationUsingKeyFrames keyFramesAnimationX = new DoubleAnimationUsingKeyFrames();
        keyFramesAnimationX.Duration = new Duration(TimeSpan.FromMilliseconds(path.Count * cost));
        Storyboard.SetTarget(keyFramesAnimationX, Spirit);
        Storyboard.SetTargetProperty(keyFramesAnimationX, new PropertyPath("X"));

        DoubleAnimationUsingKeyFrames keyFramesAnimationY = new DoubleAnimationUsingKeyFrames();
        keyFramesAnimationY.Duration = new Duration(TimeSpan.FromMilliseconds(path.Count * cost));
        Storyboard.SetTarget(keyFramesAnimationY, Spirit);
        Storyboard.SetTargetProperty(keyFramesAnimationY, new PropertyPath("Y"));

        for (int i = 0; i < framePosition.Count(); i++) {
            LinearDoubleKeyFrame keyFrame = new LinearDoubleKeyFrame();
            keyFrame.Value = i == 0 ? Spirit.X : (framePosition[i].X - SpiritCenterX) * GridSize;
            keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
            keyFramesAnimationX.KeyFrames.Add(keyFrame);

            keyFrame = new LinearDoubleKeyFrame();
            keyFrame.Value = i == 0 ? Spirit.Y : (framePosition[i].Y - SpiritCenterY) * GridSize;
            keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
            keyFramesAnimationY.KeyFrames.Add(keyFrame);
        }
        ......
    }
}

黃底為修改重點:
• PropertyPath("X")、PropertyPath("Y") 目標改為精靈控件的 X、Y 依賴屬性。
• keyFrame.Value = i == 0 ? Spirit.X : ... 首幀用當前位置平滑銜接。若移除三元運算符直接用路徑點座標,重新點擊時角色會瞬間跳動(起始座標定位錯誤)。

GridSize=20 關鍵幀平滑銜接示意:首幀從當前位置出發,後續幀對應路徑節點。

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