Esempio n. 1
0
        /// <summary>
        /// Updates the camera by following the rectangle given in a smooth manner.
        /// </summary>
        /// <param name="rectangle"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="active">Should the camera follow the rectangle.</param>
        public void UpdateSmoothly(Rectangle rectangle, int width, int height, bool active)
        {
            Vector3 currentLeftCorner;

            // If the camera is not active, which is used to show the player is dead, the camera stops moving.
            if (active)
            {
                Vector2 playerPos = new Vector2(rectangle.X + rectangle.Width / 2, rectangle.Y + rectangle.Height / 2);
                currentLeftCorner = new Vector3(-playerPos.X + _defRes.X / _zoom / 2, -playerPos.Y + (3 * _defRes.Y / _zoom / 5), 0);
            }
            else
            {
                currentLeftCorner = LastCameraLeftCorner;
            }

            if (LockedX)
            {
                currentLeftCorner.X = LastCameraLeftCorner.X;
            }
            if (LockedY)
            {
                currentLeftCorner.Y = LastCameraLeftCorner.Y;
            }
            if (RestricedToGameWorld)
            {
                if (currentLeftCorner.X > 0)
                {
                    currentLeftCorner.X = 0;
                }
                if (currentLeftCorner.X < -(width * TMBAW_Game.Tilesize - _defRes.X))
                {
                    currentLeftCorner.X = -(width * TMBAW_Game.Tilesize - _defRes.X);
                }
                if (currentLeftCorner.Y > 0)
                {
                    currentLeftCorner.Y = 0;
                }
                if (currentLeftCorner.Y < -(height * TMBAW_Game.Tilesize - _defRes.Y))
                {
                    currentLeftCorner.Y = -(height * TMBAW_Game.Tilesize - _defRes.Y);
                }
            }

            if (InputSystem.IsKeyDown(Keys.OemMinus))
            {
                ButtonBar.MinusButton_MouseClicked(null);
            }
            if (InputSystem.IsKeyDown(Keys.OemPlus))
            {
                ButtonBar.PlusButton_MouseClicked(null);
            }
            if (InputSystem.IsKeyDown(Keys.R))
            {
                ResetZoom();
            }

            Velocity = (currentLeftCorner - LastCameraLeftCorner) / 5;
            Vector3 cameraLeftCorner = LastCameraLeftCorner;

            // Used if the camera zoom changed.
            if (_updateInstantly)
            {
                cameraLeftCorner = currentLeftCorner;
                _updateInstantly = false;
            }
            else
            {
                cameraLeftCorner += Velocity;
            }

            CenterGameCoords = new Vector2(-currentLeftCorner.X, -currentLeftCorner.Y);

            LeftTopGameCoords = CenterGameCoords;

            CenterGameCoords.X += TMBAW_Game.DefaultResWidth / 2;
            CenterGameCoords.Y += TMBAW_Game.DefaultResHeight * 2 / 3;
            TileIndex           = (int)((int)CenterGameCoords.Y / TMBAW_Game.Tilesize * GameWorld.WorldData.LevelWidth) + (int)((int)CenterGameCoords.X / TMBAW_Game.Tilesize);


            LastCameraLeftCorner = cameraLeftCorner;
            _lastVelocity        = Velocity;

            int shakeOffset = 1;

            if (_shakeTimer.TimeElapsedInMilliSeconds < 100)
            {
                switch (TMBAW_Game.Random.Next(0, 5))
                {
                case 0:
                    cameraLeftCorner.X += shakeOffset;
                    break;

                case 1:
                    cameraLeftCorner.X -= shakeOffset;
                    break;

                case 2:
                    cameraLeftCorner.Y += shakeOffset;
                    break;

                case 3:
                    cameraLeftCorner.Y -= shakeOffset;
                    break;
                }
            }


            //cameraLeftCorner = new Vector3(DrawRectangle.X, DrawRectangle.Y, 0);
            cameraLeftCorner = new Vector3((int)cameraLeftCorner.X, (int)cameraLeftCorner.Y, 0);
            _translation     = Matrix.CreateTranslation(cameraLeftCorner) * Matrix.CreateScale(new Vector3(_zoom, _zoom, 0));
            HalfTranslate    = Matrix.CreateTranslation(cameraLeftCorner * 2);
        }