/// <summary> /// Adds a projectile shot by the ship. /// </summary> private void AddProjectile() { var projectile = new Projectile(); var pos = new Vector2(); double angle = _player.Angle; pos.X = _player.Position.X + (int)(_playerTexture.Width / 2.0 * Math.Cos(angle)); pos.Y = _player.Position.Y + (int)(_playerTexture.Height / 2.0 * Math.Sin(angle)); projectile.Initialize(GraphicsDevice.Viewport, _projectileTexture, pos, angle, ProjectileMoveSpeed, false); _projectiles.Add(projectile); }
/// <summary> /// Reference page contains links to related conceptual articles. /// </summary> /// <param name="gameTime">Time passed since the last call to Update.</param> protected override void Update(GameTime gameTime) { long delta = gameTime.ElapsedGameTime.Milliseconds; var inputState = new Input(Keyboard.GetState(), GamePad.GetState(PlayerIndex.One)); if (_running) { if (inputState.Escape()) { _running = false; _menu.SelectedMenuScreen = _menu.MainMenuIndex; return; } _player.Update(GraphicsDevice, inputState, delta); _lastFire += delta; if (inputState.Fire()) { if (_lastFire > _fireTime.Milliseconds) { _lastFire = 0; _shootSound.Play(); AddProjectile(); } } UpdateCollisions(); for (int i = _projectiles.Count - 1; i >= 0; i--) { _projectiles[i].Update(GraphicsDevice, inputState, delta); if (_projectiles[i].Active == false) { _projectiles.RemoveAt(i); } } for (int i = _explosions.Count - 1; i >= 0; i--) { _explosions[i].Update(GraphicsDevice, inputState, delta); if (_explosions[i].Active == false) { _explosions.RemoveAt(i); } } for (int i = _enemies.Count - 1; i >= 0; i--) { _enemies[i].Update(GraphicsDevice, inputState, delta); if (_enemies[i].Active == false) { _enemies.RemoveAt(i); } else { if (_enemies[i].LastFired > _fireTime.Milliseconds) { _enemies[i].LastFired = 0; double angle; if (_enemies[i].Accurate) { angle = Math.Atan2(_player.Position.Y - _enemies[i].Position.Y, _player.Position.X - _enemies[i].Position.X); } else { angle = _rand.NextDouble() * MathHelper.TwoPi; } Vector2 position = _enemies[i].Position + new Vector2((float)(32 * Math.Cos(angle)), (float)(32 * Math.Sin(angle))); var projectile = new Projectile(); projectile.Initialize(GraphicsDevice.Viewport, _projectileTexture, position, angle, ProjectileMoveSpeed, true); _projectiles.Add(projectile); } } } UpdateAsteroids(delta, inputState); base.Update(gameTime); } else { _menu.Update(GraphicsDevice, inputState, delta); } }