/// <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> /// /// </summary> /// <param name="camera"></param> /// <param name="animationKeyFrames"></param> /// <param name="animationKeyFramesCameraPosition"></param> /// <param name="animationKeyFramesCameraLookDirection"></param> private void ApplyAnimation(Point3DAnimationUsingKeyFrames animationKeyFrames, Point3DAnimationUsingKeyFrames animationKeyFramesCameraPosition, Vector3DAnimationUsingKeyFrames animationKeyFramesCameraLookDirection, DoubleAnimationUsingKeyFrames animationKeyFramesFieldofView) { double factor = 5; List <Cube> cubeCollection = CalculateDistance(camera); for (int i = 0; i < cubeCollection.Count; i++) { DoubleAnimationUsingKeyFrames opacitykeyFrame = new DoubleAnimationUsingKeyFrames(); double oldOpacity = 0; double newOpacity; double delta = 0; if ((cubeCollection[i].NewDistanceFromViewer - cubeCollection[i].OldDistanceFromViewer) > 0) { oldOpacity = .8; delta = (.1) / factor; } else { oldOpacity = 1; delta = -(.2) / factor; } for (int count = 1; count < factor; count++) { newOpacity = oldOpacity + delta * count; if (newOpacity > 0 && newOpacity <= 1) { LinearDoubleKeyFrame linearkeyFrame = new LinearDoubleKeyFrame(newOpacity); opacitykeyFrame.KeyFrames.Add(linearkeyFrame); } } cubeCollection[i].BeginAnimation(Cube.opacityProperty, opacitykeyFrame, HandoffBehavior.SnapshotAndReplace); } Magnet.BeginAnimation(Cube.StartingPointCubeProperty, animationKeyFrames, HandoffBehavior.Compose); this.ViewModelCamera.BeginAnimation(PerspectiveCamera.PositionProperty, animationKeyFramesCameraPosition, HandoffBehavior.Compose); this.ViewModelCamera.BeginAnimation(PerspectiveCamera.LookDirectionProperty, animationKeyFramesCameraLookDirection, HandoffBehavior.Compose); this.ViewModelCamera.BeginAnimation(PerspectiveCamera.FieldOfViewProperty, animationKeyFramesFieldofView, HandoffBehavior.Compose); this.cubeAnimationCompleted = false; this.positionAnimationCompleted = false; this.cameraLookdirectionAnimationCompleted = false; this.fieldViewAnimationCompleted = false; }
protected override Storyboard CreateAnimation(TransitionInfo transitionInfo) { var storyboard = new Storyboard(); Point3DAnimationUsingKeyFrames cameraPositionAnimation; DoubleAnimationUsingKeyFrames cameraRotationAnimation; // Camera distance animation cameraPositionAnimation = new Point3DAnimationUsingKeyFrames { Duration = Duration }; cameraPositionAnimation.KeyFrames.Add(new EasingPoint3DKeyFrame(_cameraInitialPosition, KeyTime.FromPercent(0))); cameraPositionAnimation.KeyFrames.Add(new EasingPoint3DKeyFrame(_cameraIntermediatePosition, KeyTime.FromPercent(0.25))); cameraPositionAnimation.KeyFrames.Add(new EasingPoint3DKeyFrame(_cameraIntermediatePosition, KeyTime.FromPercent(0.75))); cameraPositionAnimation.KeyFrames.Add(new EasingPoint3DKeyFrame(_cameraInitialPosition, KeyTime.FromPercent(1))); Storyboard.SetTargetName(cameraPositionAnimation, CameraObjectName); Storyboard.SetTargetProperty(cameraPositionAnimation, new PropertyPath(ProjectionCamera.PositionProperty)); // Flip animation switch (Direction) { case FlipDirection.LeftToRight: case FlipDirection.BottomToTop: cameraRotationAnimation = new DoubleAnimationUsingKeyFrames { Duration = Duration }; cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(0, KeyTime.FromPercent(0.25))); cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(-180, KeyTime.FromPercent(0.75))); cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(-180, KeyTime.FromPercent(1))); break; default: cameraRotationAnimation = new DoubleAnimationUsingKeyFrames { Duration = Duration }; cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(0, KeyTime.FromPercent(0.25))); cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(180, KeyTime.FromPercent(0.75))); cameraRotationAnimation.KeyFrames.Add(new EasingDoubleKeyFrame(180, KeyTime.FromPercent(1))); break; } Storyboard.SetTargetName(cameraRotationAnimation, CameraRotationObjectName); Storyboard.SetTargetProperty(cameraRotationAnimation, new PropertyPath(AxisAngleRotation3D.AngleProperty)); storyboard.Children.Add(cameraPositionAnimation); storyboard.Children.Add(cameraRotationAnimation); return(storyboard); }
/// <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; }
/// <summary> /// 以某个区块为焦点调整焦距 /// </summary> /// <param name="r">区块的横向编号,值域[0, 4],其中2是屏幕纵向正中</param> /// <param name="c">区块的纵向编号,值域[0, 32],其中0是屏幕横向正中</param> /// <param name="ratio">缩放的倍率,值域[0.0, +∞],原始尺寸对应于1.0,原始尺寸指设置中所定义的立绘原始缩放比</param> /// <param name="immediate">是否立即执行完毕</param> public static void FocusOn(int r, int c, double ratio, bool immediate = false) { var aniTime = immediate ? 1 : PreviewSCamera3D.animationTimeMS; // 计算运动轨迹 var orgPoint = PreviewSCamera3D.GetScreenCoordination(PreviewSCamera3D.SCameraFocusRow, PreviewSCamera3D.SCameraFocusCol); var destPoint = PreviewSCamera3D.GetScreenCoordination(r, c); var destZ = PreviewSCamera3D.GetCameraZIndex(ratio); var deltaXY = PreviewSCamera3D.GetManhattanDistance(destPoint, orgPoint); var actualBeginPoint = PreviewSCamera3D.ST3D_Camera.Position; // 动画 Point3DAnimationUsingKeyFrames v3dAni = new Point3DAnimationUsingKeyFrames(); EasingPoint3DKeyFrame k1 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X, actualBeginPoint.Y, PreviewSCamera3D.SCameraScale), KeyTime = TimeSpan.FromMilliseconds(0), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; EasingPoint3DKeyFrame k2 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X + deltaXY.X, actualBeginPoint.Y + deltaXY.Y, destZ), KeyTime = TimeSpan.FromMilliseconds(aniTime), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; v3dAni.KeyFrames.Add(k1); v3dAni.KeyFrames.Add(k2); v3dAni.FillBehavior = FillBehavior.Stop; v3dAni.Completed += delegate { lock (PreviewSCamera3D.AnimatingStorySet) { PreviewSCamera3D.AnimatingStorySet.Remove(v3dAni); } PreviewSCamera3D.ST3D_Camera.Position = new Point3D(actualBeginPoint.X + deltaXY.X, actualBeginPoint.Y + deltaXY.Y, destZ); }; PreviewSCamera3D.ST3D_Camera.BeginAnimation(ProjectionCamera.PositionProperty, v3dAni); // 更新后台 PreviewSCamera3D.SCameraFocusRow = r; PreviewSCamera3D.SCameraFocusCol = c; PreviewSCamera3D.SCameraScale = destZ; }
/// <summary> /// 重置镜头将中央和焦点都对准屏幕中心并采用1.0的对焦比例 /// </summary> /// <param name="doubledDuration">是否2倍动画时间</param> public static void ResetFocus(bool doubledDuration) { int aniTime = doubledDuration ? PreviewSCamera3D.animationTimeMS * 2 : PreviewSCamera3D.animationTimeMS; var actualBeginPoint = PreviewSCamera3D.ST3D_Camera.Position; Point3DAnimationUsingKeyFrames v3dAni = new Point3DAnimationUsingKeyFrames(); EasingPoint3DKeyFrame k1 = new EasingPoint3DKeyFrame() { Value = new Point3D(actualBeginPoint.X, actualBeginPoint.Y, PreviewSCamera3D.SCameraScale), KeyTime = TimeSpan.FromMilliseconds(0), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; EasingPoint3DKeyFrame k2 = new EasingPoint3DKeyFrame() { Value = new Point3D(0, 0, PreviewSCamera3D.orginalCameraZIndex), KeyTime = TimeSpan.FromMilliseconds(aniTime), EasingFunction = new CubicEase() { EasingMode = EasingMode.EaseOut } }; v3dAni.KeyFrames.Add(k1); v3dAni.KeyFrames.Add(k2); v3dAni.FillBehavior = FillBehavior.Stop; v3dAni.Completed += delegate { lock (PreviewSCamera3D.AnimatingStorySet) { PreviewSCamera3D.AnimatingStorySet.Remove(v3dAni); } PreviewSCamera3D.ST3D_Camera.Position = new Point3D(0, 0, PreviewSCamera3D.orginalCameraZIndex); }; PreviewSCamera3D.ST3D_Camera.BeginAnimation(ProjectionCamera.PositionProperty, v3dAni); // 更新后台 PreviewSCamera3D.SCameraFocusRow = PreviewSCamera3D.GAME_SCAMERA_SCR_ROWCOUNT / 2; PreviewSCamera3D.SCameraFocusCol = 0; PreviewSCamera3D.SCameraScale = PreviewSCamera3D.orginalCameraZIndex; }
/// <summary> /// /// </summary> /// <param name="MovingCube"></param> /// <param name="direction"></param> private void MoveCube(Cube MovingCube, Direction direction) { if (this.cubeAnimationCompleted == true && this.positionAnimationCompleted == true && this.cameraLookdirectionAnimationCompleted == true && this.fieldViewAnimationCompleted == true && CountMovingBlocks == 0) { Point3D cameraPosition = this.ViewModelCamera.Position; Vector3D cameraLookDirection = this.ViewModelCamera.LookDirection; double cameraFieldOfView = this.ViewModelCamera.FieldOfView; double cubeWidthHeight = (MovingCube.WidthHeightDepth); if (animationKeyFramesBox != null) { animationKeyFramesBox.Completed -= AnimationKeyFramesBox_Completed; } animationKeyFramesBox = new Point3DAnimationUsingKeyFrames(); animationKeyFramesBox.Completed += new EventHandler(AnimationKeyFramesBox_Completed); if (animationFieldView != null) { animationFieldView.Completed -= new EventHandler(AnimationFieldView_Completed); } animationFieldView = new DoubleAnimationUsingKeyFrames(); animationFieldView.Completed += new EventHandler(AnimationFieldView_Completed); if (animationKeyFramesCameraPosition != null) { animationKeyFramesCameraPosition.Completed -= new EventHandler(AnimationKeyFramesCameraPosition_Completed); } animationKeyFramesCameraPosition = new Point3DAnimationUsingKeyFrames(); animationKeyFramesCameraPosition.Completed += new EventHandler(AnimationKeyFramesCameraPosition_Completed); if (animationKeyFramesCameraLookDirection != null) { animationKeyFramesCameraLookDirection.Completed -= new EventHandler(AnimationKeyFramesCameraLookDirection_Completed); } animationKeyFramesCameraLookDirection = new Vector3DAnimationUsingKeyFrames(); animationKeyFramesCameraLookDirection.Completed += new EventHandler(AnimationKeyFramesCameraLookDirection_Completed); animationKeyFramesBox.Duration = BlockMovementTime; animationFieldView.Duration = BlockMovementTime; animationKeyFramesCameraPosition.Duration = BlockMovementTime; animationKeyFramesCameraLookDirection.Duration = BlockMovementTime; animationKeyFramesBox.BeginTime = BlockBeginTime; animationFieldView.BeginTime = BlockBeginTime; animationKeyFramesCameraPosition.BeginTime = BlockBeginTime; animationKeyFramesCameraLookDirection.BeginTime = BlockBeginTime; Point3D cubeLocation = new Point3D(MovingCube.StartingPointCube.X, MovingCube.StartingPointCube.Y, MovingCube.StartingPointCube.Z); ///Check if Magnet can move in right direction bool canMove = false; int counter; int emptyPositionOrFloor = 0; switch (direction) { case Direction.Up: for (counter = MagnetFloorNo + 1; counter < Constants.NoofFloor; counter++) { if (position[counter][MagnetPositionOnFloor] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; case Direction.Down: for (counter = MagnetFloorNo - 1; counter >= 0; counter--) { if (position[counter][MagnetPositionOnFloor] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; case Direction.Left: int extremeLeftPos = MagnetPositionOnFloor - MagnetPositionOnFloor % Constants.BlocksInXdirection; for (counter = MagnetPositionOnFloor - 1; counter >= extremeLeftPos; counter--) { if (position[MagnetFloorNo][counter] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; case Direction.Right: int extremeRightPos = MagnetPositionOnFloor + Constants.BlocksInXdirection - MagnetPositionOnFloor % Constants.BlocksInXdirection; for (counter = MagnetPositionOnFloor + 1; counter < extremeRightPos; counter++) { if (position[MagnetFloorNo][counter] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; case Direction.Front: int extremeFrontPos = Constants.BlocksInXdirection * Constants.BlocksInZdirection; for (counter = MagnetPositionOnFloor; counter < extremeFrontPos; counter = counter + Constants.BlocksInXdirection) { if (position[MagnetFloorNo][counter] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; case Direction.Back: int extremeBackPos = 0; for (counter = MagnetPositionOnFloor; counter >= extremeBackPos; counter = counter - Constants.BlocksInXdirection) { if (position[MagnetFloorNo][counter] == null) { emptyPositionOrFloor = counter; canMove = true; break; } } break; default: break; } if (canMove == true) { this.StepCount++; for (int i = 0; i < cubeWidthHeight; i++) { switch (direction) { case Direction.Up: if (cubeLocation.Y <= Math.Ceiling((Constants.NoofFloor - 1) * cubeWidthHeight)) { cubeLocation.Y++; cameraPosition.Y = cameraPosition.Y + Constants.LeftRightCameraDelta; cameraLookDirection.Y = cameraLookDirection.Y - Constants.LeftRightCameraDelta; goto default; } break; case Direction.Down: if (cubeLocation.Y >= 0) { cubeLocation.Y--; cameraPosition.Y = cameraPosition.Y - Constants.LeftRightCameraDelta; cameraLookDirection.Y = cameraLookDirection.Y + Constants.LeftRightCameraDelta; goto default; } break; case Direction.Left: if (cubeLocation.X > 0) { cubeLocation.X--; cameraPosition.X = cameraPosition.X - Constants.LeftRightCameraDelta; cameraLookDirection.X = cameraLookDirection.X + Constants.LeftRightCameraDelta; goto default; } break; case Direction.Right: if (cubeLocation.X <= Math.Ceiling((Constants.BlocksInXdirection - 1) * cubeWidthHeight)) { cubeLocation.X++; cameraPosition.X = cameraPosition.X + Constants.LeftRightCameraDelta; cameraLookDirection.X = cameraLookDirection.X - Constants.LeftRightCameraDelta; goto default; } break; case Direction.Front: if (cubeLocation.Z <= Math.Ceiling(((Constants.BlocksInZdirection - 1)) * cubeWidthHeight)) { cubeLocation.Z++; cameraPosition.Z = cameraPosition.Z + 1; cameraLookDirection.Z = cameraLookDirection.Z - 1; cameraFieldOfView = cameraFieldOfView - .05; goto default; } break; case Direction.Back: if (cubeLocation.Z >= 0) { cubeLocation.Z--; cameraPosition.Z = cameraPosition.Z - 1; cameraLookDirection.Z = cameraLookDirection.Z + 1; cameraFieldOfView = cameraFieldOfView + .05; goto default; } break; default: LinearPoint3DKeyFrame linear3dkeyframeBox = new LinearPoint3DKeyFrame(cubeLocation); animationKeyFramesBox.KeyFrames.Add(linear3dkeyframeBox); LinearPoint3DKeyFrame linear3dkeyframeCameraPosion = new LinearPoint3DKeyFrame(cameraPosition); animationKeyFramesCameraPosition.KeyFrames.Add(linear3dkeyframeCameraPosion); LinearVector3DKeyFrame linear3dkeyframeCameraLookDirection = new LinearVector3DKeyFrame(cameraLookDirection); animationKeyFramesCameraLookDirection.KeyFrames.Add(linear3dkeyframeCameraLookDirection); LinearDoubleKeyFrame linearDoubleKeyFrame = new LinearDoubleKeyFrame(cameraFieldOfView); animationFieldView.KeyFrames.Add(linearDoubleKeyFrame); break; } } switch (direction) { case Direction.Up: if (cubeLocation.Y <= Math.Ceiling((Constants.NoofFloor - 1) * cubeWidthHeight)) { for (counter = emptyPositionOrFloor - 1; counter > MagnetFloorNo; counter--) { this.MoveBlocks(position[counter][MagnetPositionOnFloor], 1, Direction.Up); position[counter + 1][MagnetPositionOnFloor] = position[counter][MagnetPositionOnFloor]; } MagnetFloorNo++; position[MagnetFloorNo][MagnetPositionOnFloor] = position[MagnetFloorNo - 1][MagnetPositionOnFloor]; position[MagnetFloorNo - 1][MagnetPositionOnFloor] = null; goto default; } break; case Direction.Down: if (Math.Ceiling(cubeLocation.Y) >= 0) { for (counter = emptyPositionOrFloor + 1; counter < MagnetFloorNo; counter++) { this.MoveBlocks(position[counter][MagnetPositionOnFloor], 1, Direction.Down); position[counter - 1][MagnetPositionOnFloor] = position[counter][MagnetPositionOnFloor]; } position[MagnetFloorNo - 1][MagnetPositionOnFloor] = position[MagnetFloorNo][MagnetPositionOnFloor]; position[MagnetFloorNo][MagnetPositionOnFloor] = null; MagnetFloorNo--; goto default; } break; case Direction.Left: if (cubeLocation.X >= 0) { for (counter = emptyPositionOrFloor + 1; counter < MagnetPositionOnFloor; counter++) { this.MoveBlocks(position[MagnetFloorNo][counter], 1, Direction.Left); position[MagnetFloorNo][counter - 1] = position[MagnetFloorNo][counter]; } position[MagnetFloorNo][MagnetPositionOnFloor - 1] = position[MagnetFloorNo][MagnetPositionOnFloor]; position[MagnetFloorNo][MagnetPositionOnFloor] = null; MagnetPositionOnFloor--; goto default; } break; case Direction.Right: if (cubeLocation.X <= Math.Ceiling((Constants.BlocksInXdirection - 1) * cubeWidthHeight)) { for (counter = emptyPositionOrFloor - 1; counter > MagnetPositionOnFloor; counter--) { this.MoveBlocks(position[MagnetFloorNo][counter], 1, Direction.Right); position[MagnetFloorNo][counter + 1] = position[MagnetFloorNo][counter]; } position[MagnetFloorNo][MagnetPositionOnFloor + 1] = position[MagnetFloorNo][MagnetPositionOnFloor]; position[MagnetFloorNo][MagnetPositionOnFloor] = null; MagnetPositionOnFloor++; goto default; } break; case Direction.Front: if (cubeLocation.Z <= Math.Ceiling(((Constants.BlocksInZdirection - 1)) * cubeWidthHeight)) { for (counter = emptyPositionOrFloor - Constants.BlocksInXdirection; counter > MagnetPositionOnFloor; counter = counter - Constants.BlocksInXdirection) { this.MoveBlocks(position[MagnetFloorNo][counter], 1, Direction.Front); position[MagnetFloorNo][counter + Constants.BlocksInXdirection] = position[MagnetFloorNo][counter]; } position[MagnetFloorNo][MagnetPositionOnFloor + Constants.BlocksInXdirection] = position[MagnetFloorNo][MagnetPositionOnFloor]; position[MagnetFloorNo][MagnetPositionOnFloor] = null; MagnetPositionOnFloor = MagnetPositionOnFloor + Constants.BlocksInXdirection; goto default; } break; case Direction.Back: if (cubeLocation.Z >= 0) { for (counter = emptyPositionOrFloor + Constants.BlocksInXdirection; counter < MagnetPositionOnFloor; counter = counter + Constants.BlocksInXdirection) { this.MoveBlocks(position[MagnetFloorNo][counter], 1, Direction.Back); position[MagnetFloorNo][counter - Constants.BlocksInXdirection] = position[MagnetFloorNo][counter]; } position[MagnetFloorNo][MagnetPositionOnFloor - Constants.BlocksInXdirection] = position[MagnetFloorNo][MagnetPositionOnFloor]; position[MagnetFloorNo][MagnetPositionOnFloor] = null; MagnetPositionOnFloor = MagnetPositionOnFloor - Constants.BlocksInXdirection; goto default; } break; default: ApplyAnimation(animationKeyFramesBox, animationKeyFramesCameraPosition, animationKeyFramesCameraLookDirection, animationFieldView); break; } } } }
/// <summary> /// /// </summary> /// <param name="cube3d"></param> /// <param name="step"></param> /// <param name="direction"></param> private void MoveBlocks(Cube cube3d, int step, Direction direction) { if (animationKeyFramesBLocks != null) { /// animationKeyFramesBLocks.Completed -= AnimationKeyFramesBLocks_Completed; } animationKeyFramesBLocks = new Point3DAnimationUsingKeyFrames(); animationKeyFramesBLocks.Completed += new EventHandler(AnimationKeyFramesBLocks_Completed); double cubeLength = Magnet.WidthHeightDepth; animationKeyFramesBLocks.Duration = BlockMovementTime; animationKeyFramesBLocks.BeginTime = BlockBeginTime; Point3D cubeLocation = cube3d.StartingPointCube; for (int i = 0; i < cubeLength * step; i++) { switch (direction) { case Direction.Up: cubeLocation.Y++; goto default; case Direction.Down: cubeLocation.Y--; goto default; case Direction.Left: cubeLocation.X--; goto default; case Direction.Right: cubeLocation.X++; goto default; case Direction.Front: cubeLocation.Z++; goto default; case Direction.Back: cubeLocation.Z--; goto default; default: LinearPoint3DKeyFrame linear3dkeyframeBox = new LinearPoint3DKeyFrame(cubeLocation); animationKeyFramesBLocks.KeyFrames.Add(linear3dkeyframeBox); break; } } CountMovingBlocks++; cube3d.BeginAnimation(Cube.StartingPointCubeProperty, animationKeyFramesBLocks, HandoffBehavior.SnapshotAndReplace); }