/// <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); }