//Updating enemies internal void Update(float a_elapsedTime) { m_enemyProjectiles.RemoveAll(x => x.Active == false); foreach (Enemy enemy in m_enemies) { if (!m_player.IsAlive) { enemy.IsAlive = true; } //Fall & jump mechanics //Needs to be updated before Vertical collision if (!enemy.IsOnGround && !enemy.IsJumping) { enemy.Obj.Bounds.Y += Convert.ToInt32(a_elapsedTime * enemy.Speed.X); } if ((enemy.EnemyType == Enemy.Type.Jumper || enemy.EnemyType == Enemy.Type.Shooter) && enemy.IsAlive) { if (enemy.IsJumping) { enemy.IsOnGround = false; enemy.Obj.Bounds.Y -= (int)enemy.Speed.Y; enemy.SpeedY -= a_elapsedTime / 0.10f; } //Updating jump mechanics within the enemy object enemy.Update(a_elapsedTime); } //Collision handeling; Vertical m_level.CheckVerticalCollision(enemy); if (enemy.IsAlive) { enemy.Visibility = 1; //Updating logic for enemy type; Shooter if (enemy.EnemyType == Enemy.Type.Shooter) { #region Shooter bool leftDirection = m_player.Rectangle.Center.X < enemy.Rectangle.Center.X; if (enemy.ProjectileCoolDown <= 0) { int shotSpawn; if (leftDirection) { shotSpawn = enemy.Rectangle.Left; } else { shotSpawn = enemy.Rectangle.Right; } m_enemyProjectiles.Add(new Projectile(shotSpawn, enemy.Rectangle.Center.Y - 5, leftDirection)); enemy.ProjectileCoolDown = 2; } else { enemy.ProjectileCoolDown -= a_elapsedTime; } if ((enemy.ProjectileCoolDown < 0.5 || enemy.ProjectileCoolDown > 1.5)) { if (leftDirection) { enemy.UnitState = State.ID.JUMPING_LEFT; } else { enemy.UnitState = State.ID.JUMPING_RIGHT; } } else { if (leftDirection) { enemy.UnitState = State.ID.FACING_LEFT; } else { enemy.UnitState = State.ID.FACING_RIGHT; } } #endregion } //Updating logic for enemy type; Crawler and Jumper #region Crawler & Jumper horizontal movments if ((enemy.UnitState != State.ID.MOVING_RIGHT && enemy.UnitState != State.ID.MOVING_LEFT) && enemy.EnemyType != Enemy.Type.Shooter) { enemy.UnitState = State.ID.MOVING_RIGHT; } if (enemy.UnitState == State.ID.MOVING_RIGHT) { enemy.Obj.Bounds.X += Convert.ToInt32(a_elapsedTime * enemy.Speed.X); } else if (enemy.UnitState == State.ID.MOVING_LEFT) { enemy.Obj.Bounds.X -= Convert.ToInt32(a_elapsedTime * enemy.Speed.X); } #endregion if (m_level.DidReachTurningPoint(enemy)) { if (enemy.UnitState == State.ID.MOVING_RIGHT) { enemy.UnitState = State.ID.MOVING_LEFT; } else { enemy.UnitState = State.ID.MOVING_RIGHT; } } CheckPlayerCollision(enemy); } else { enemy.Visibility = enemy.Visibility - 0.01f; } } //Updating all projectiles generated from enemy type; Shooter foreach (Projectile projectile in m_enemyProjectiles) { if (projectile.DirectionLeft) { projectile.X -= Convert.ToInt32(a_elapsedTime * projectile.Speed); } else { projectile.X += Convert.ToInt32(a_elapsedTime * projectile.Speed); } if (projectile.Rec.Intersects(m_player.Rectangle)) { m_player.LostLife(); } } }