/// <summary> /// 将镜头中心平移到指定的区块 /// </summary> /// <param name="r">区块的横向编号,值域[0, 14],其中7是屏幕纵向正中</param> /// <param name="c">区块的纵向编号,值域[0, 32],其中0是屏幕横向正中</param> public static void Translate(int r, int c) { // 计算运动轨迹 var orgPoint = SCamera3D.GetScreenCoordination(SCamera3D.lastFocusRow, SCamera3D.lastFocusCol); var destPoint = SCamera3D.GetScreenCoordination(r, c); var delta = SCamera3D.GetManhattanDistance(destPoint, orgPoint); var actualBeginPoint = ViewManager.View3D.ST3D_Camera.Position; // 动画 Point3DAnimationUsingKeyFrames v3dAni = new Point3DAnimationUsingKeyFrames(); EasingPoint3DKeyFrame k1 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X, actualBeginPoint.Y, SCamera3D.lastZIndex), KeyTime = TimeSpan.FromMilliseconds(0), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; EasingPoint3DKeyFrame k2 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X + delta.X, actualBeginPoint.Y + delta.Y, SCamera3D.lastZIndex), KeyTime = TimeSpan.FromMilliseconds(SCamera3D.animationTimeMS), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; v3dAni.KeyFrames.Add(k1); v3dAni.KeyFrames.Add(k2); v3dAni.FillBehavior = FillBehavior.Stop; AnimationClock aniClock = v3dAni.CreateClock(); lock (SCamera3D.AnimatingStorySet) { SCamera3D.AnimatingStorySet.Add(aniClock); } v3dAni.Completed += delegate { lock (SCamera3D.AnimatingStorySet) { SCamera3D.AnimatingStorySet.Remove(aniClock); } ViewManager.View3D.ST3D_Camera.Position = new Point3D(actualBeginPoint.X + delta.X, actualBeginPoint.Y + delta.Y, SCamera3D.lastZIndex); }; ViewManager.View3D.ST3D_Camera.BeginAnimation(ProjectionCamera.PositionProperty, v3dAni); // 更新后台 Director.ScrMana.SCameraFocusRow = SCamera3D.lastFocusRow = r; Director.ScrMana.SCameraFocusCol = SCamera3D.lastFocusCol = c; Director.ScrMana.SCameraScale = SCamera3D.lastZIndex; }
/// <summary> /// 重置镜头将中央和焦点都对准屏幕中心并采用1.0的对焦比例 /// </summary> /// <param name="doubledDuration">是否2倍动画时间</param> public static void ResetFocus(bool doubledDuration) { int aniTime = doubledDuration ? SCamera3D.animationTimeMS * 2 : SCamera3D.animationTimeMS; var actualBeginPoint = ViewManager.View3D.ST3D_Camera.Position; Point3DAnimationUsingKeyFrames v3dAni = new Point3DAnimationUsingKeyFrames(); EasingPoint3DKeyFrame k1 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X, actualBeginPoint.Y, SCamera3D.lastZIndex), KeyTime = TimeSpan.FromMilliseconds(0), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; EasingPoint3DKeyFrame k2 = new EasingPoint3DKeyFrame() { Value = new Point3D(0, 0, SCamera3D.orginalCameraZIndex), KeyTime = TimeSpan.FromMilliseconds(aniTime), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; v3dAni.KeyFrames.Add(k1); v3dAni.KeyFrames.Add(k2); v3dAni.FillBehavior = FillBehavior.Stop; AnimationClock aniClock = v3dAni.CreateClock(); lock (SCamera3D.AnimatingStorySet) { SCamera3D.AnimatingStorySet.Add(aniClock); } v3dAni.Completed += delegate { lock (SCamera3D.AnimatingStorySet) { SCamera3D.AnimatingStorySet.Remove(aniClock); } ViewManager.View3D.ST3D_Camera.Position = new Point3D(0, 0, SCamera3D.orginalCameraZIndex); }; ViewManager.View3D.ST3D_Camera.BeginAnimation(ProjectionCamera.PositionProperty, v3dAni); // 更新后台 Director.ScrMana.SCameraFocusRow = SCamera3D.lastFocusRow = GlobalConfigContext.GAME_SCAMERA_SCR_ROWCOUNT / 2; Director.ScrMana.SCameraFocusCol = SCamera3D.lastFocusCol = 0; Director.ScrMana.SCameraScale = SCamera3D.lastZIndex = SCamera3D.orginalCameraZIndex; }