Exemple #1
0
        /// <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;
        }
Exemple #2
0
        /// <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;
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        /// <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;
        }
Exemple #5
0
        /// <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;
        }
Exemple #6
0
        /// <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;
        }
Exemple #7
0
        /// <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;
                    }
                }
            }
        }
Exemple #8
0
        /// <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);
        }