Пример #1
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            currentKeyState   = Keyboard.GetState();
            currentMouseState = Mouse.GetState();

            if (oldKeyState == null)
            {
                oldKeyState = currentKeyState;
            }
            if (oldMouseState == null)
            {
                oldMouseState = currentMouseState;
            }

            foreach (Sprite floor in floors)
            {
                if (playerSprite.IsCollided(floor))
                {
                    if (playerSprite.GetVelocity().Y > 0)
                    {
                        if (playerSprite.AccelerateY(0.1f, 0 * -1) < 0 == false)
                        {
                            playerSprite.UpperLeft = new Vector2(playerSprite.UpperLeft.X, floor.UpperLeft.Y - playerSprite.GetHeight() + 1);
                        }
                        playerSprite.SetVelocity(playerSprite.GetVelocity().X, 0);

                        jumped    = false;
                        jumping   = false;
                        jumpSpeed = -1f;

                        if (!firing)
                        {
                            fired = false;
                            verticalCompensation = 0;
                        }
                    }

                    floored = true;
                }
            }

            walking = false;

            if (currentKeyState.IsKeyDown(Keys.A))
            {
                playerSprite.Accelerate(-0.2f, 0);
                walking = true;
                if (playerSprite.GetVelocity().X > 0)
                {
                    playerSprite.Accelerate(-playerSprite.windResistance, 0);
                }
            }

            if (currentKeyState.IsKeyDown(Keys.D))
            {
                playerSprite.Accelerate(0.2f, 0);
                walking = true;
                if (playerSprite.GetVelocity().X < 0)
                {
                    playerSprite.Accelerate(playerSprite.windResistance, 0);
                }
            }

            if ((currentMouseState.LeftButton == ButtonState.Pressed) && (mana > 0))
            {
                double direction = Sprite.CalculateDirectionAngle(new Vector2(currentMouseState.X - ((playerSprite.UpperLeft.X - camera.UpperLeft.X) + playerSprite.GetWidth() / 2),
                                                                              (currentMouseState.Y - ((playerSprite.UpperLeft.Y - camera.UpperLeft.Y) - playerSprite.GetHeight() / 2))));

                projectileSprite = new Sprite();
                projectileSprite.SetTexture(projectileTexture);
                projectileSprite.RotationAngle = direction;
                projectileSprite.SetSpeedAndDirection(1, direction);
                projectileSprite.UpperLeft = new Vector2(playerSprite.UpperLeft.X + playerSprite.GetWidth() / 2,
                                                         playerSprite.UpperLeft.Y + playerSprite.GetHeight() / 2);
                activeProjectiles.AddFirst(projectileSprite);
                activeSprites.AddFirst(projectileSprite);

                direction = Sprite.CalculateDirectionAngle(new Vector2(((playerSprite.UpperLeft.X - camera.UpperLeft.X) + playerSprite.GetWidth() / 2) - currentMouseState.X,
                                                                       (((playerSprite.UpperLeft.Y - camera.UpperLeft.Y) - playerSprite.GetHeight() / 2) - currentMouseState.Y) * -1));

                //playerSprite.AccelerateX(10, direction * -1);
                if (floored)
                {
                    playerSprite.AccelerateX(0.01f, direction * -1);
                    horizontalCompensation = 0;
                    horizontalAddition     = 0.1f;
                }
                else
                {
                    playerSprite.AccelerateX(horizontalCompensation, direction * -1);
                    if (horizontalAddition < 0.2)
                    {
                        horizontalCompensation += horizontalAddition;
                        horizontalAddition     += 0.01f;
                    }
                }
                if ((direction > 90) && (direction <= 270))
                {
                    if (playerSprite.GetVelocity().X > 0)
                    {
                        playerSprite.Accelerate(-playerSprite.windResistance, 0);
                    }
                }
                if (((direction > 270) && (direction <= 360)) || ((direction > 0) && (direction <= 90)))
                {
                    if (playerSprite.GetVelocity().X < 0)
                    {
                        playerSprite.Accelerate(playerSprite.windResistance, 0);
                    }
                }

                if (playerSprite.AccelerateY(0.1f, direction * -1) < 0)
                {
                    playerSprite.AccelerateY(verticalCompensation, direction * -1);
                    if (verticalAddition > 0)
                    {
                        verticalCompensation += verticalAddition;
                        verticalAddition     -= 0.01f;
                    }
                }
                else
                {
                    verticalCompensation = 0;
                    verticalAddition     = 0.1f;
                }

                mana -= 1;

                fired  = true;
                firing = true;
            }
            else if ((currentMouseState.LeftButton == ButtonState.Released))
            {
                mana = 100;

                firing = false;

                verticalCompensation = 0;
                verticalAddition     = 0.1f;
            }
            else
            {
                firing = false;

                verticalCompensation = 0;
                verticalAddition     = 0.1f;
            }

            if (currentKeyState.IsKeyDown(Keys.W) && oldKeyState.IsKeyUp(Keys.W))
            {
                if (jumped == false)
                {
                    playerSprite.SetVelocity(playerSprite.GetVelocity().X, -10);
                    playerSprite.UpperLeft.Y -= 10;
                    jumped  = true;
                    jumping = true;

                    jumpSpeed = -0.6f;
                }
            }
            else if (currentKeyState.IsKeyDown(Keys.W) && jumped == true && jumping == true)
            {
                if (jumpSpeed < 0)
                {
                    playerSprite.Accelerate(0, jumpSpeed);
                    jumpSpeed += 0.015f;
                }
            }
            else
            {
                jumping = false;
            }


            if (!floored)
            {
                playerSprite.Accelerate(0, playerSprite.gravity);
            }

            if ((!walking) && (!firing))
            {
                if (playerSprite.GetVelocity().X > 0)
                {
                    playerSprite.Accelerate(-playerSprite.windResistance, 0);
                }
                if (playerSprite.GetVelocity().X < 0)
                {
                    playerSprite.Accelerate(playerSprite.windResistance, 0);
                }
                if ((playerSprite.GetVelocity().X < 0.5) && (playerSprite.GetVelocity().X > -0.5) && (playerSprite.GetVelocity().X != 0))
                {
                    playerSprite.SetVelocity(0, playerSprite.GetVelocity().Y);
                }
            }

            //playerSprite.Move();
            foreach (Sprite sprite in activeProjectiles)
            {
                double X = sprite.GetVelocity().X;
                double Y = sprite.GetVelocity().Y;

                if (X < 0)
                {
                    X *= -1;
                }
                if (Y < 0)
                {
                    Y *= -1;
                }
                //if ((sprite.GetVelocity().X <= 0.01) && (sprite.GetVelocity().Y <= 0.01))
                if ((X <= 0.01) && (Y <= 0.01))
                {
                    sprite.SetVelocity(0, 0);
                    sprite.IsAlive = false;
                }
                if (sprite.lifeSpan >= 60)
                {
                    sprite.AccelerateDirection(-0.01, sprite.GetDirectionAngle());
                }
            }


            foreach (Sprite sprite in activeSprites)
            {
                sprite.Move();
                sprite.lifeSpan += 1;
            }
            camera.UpperLeft = new Vector2((playerSprite.UpperLeft.X - playerSprite.GetWidth() / 2) - (camera.ViewWidth / 2),
                                           (playerSprite.UpperLeft.Y + playerSprite.GetHeight()) - ((camera.ViewHeight / 4) * 3));
            //camera.LockCamera();

            oldKeyState   = currentKeyState;
            oldMouseState = currentMouseState;
            floored       = false;

            base.Update(gameTime);
        }