public EnemyGroup(GraphicsDevice gDevice, Game1 game)
 {
     moveDirection  = MoveDirection.RIGHT;
     edgeTouch      = EdgeTouch.NONE;
     graphicsDevice = gDevice;
     this.game      = game;
     for (int j = 0; j < mEnemyArray.Length; ++j)
     {
         mEnemyArray[j] = new Enemy[11];
     }
     for (int j = 0; j < mEnemyArray[0].Length; ++j)
     {
         mEnemyArray[0][j] = new Enemy(graphicsDevice, game.mPlayerSprite, 0, j, "invader1");
     }
     for (int j = 1; j < 3; ++j)
     {
         for (int k = 0; k < mEnemyArray[j].Length; ++k)
         {
             mEnemyArray[j][k] = new Enemy(graphicsDevice, game.mPlayerSprite, j, k, "invader2");
         }
     }
     for (int j = 3; j < 5; ++j)
     {
         for (int k = 0; k < mEnemyArray[j].Length; ++k)
         {
             mEnemyArray[j][k] = new Enemy(graphicsDevice, game.mPlayerSprite, j, k, "invader3");
         }
     }
 }
        public void Update(GameTime gameTime)
        {
            // Update the bullets already fired
            foreach (Bullet aBullet in mBullets)
            {
                aBullet.Update(gameTime);
            }

            // Shoot new bullets
            if (new Random().Next(100) > 75)
            {
                Enemy enemy = mEnemyArray[new Random().Next(5)][new Random().Next(11)];

                if (new Random().Next(100) <= 75)
                {
                    enemy = mEnemyArray[0][new Random().Next(6)];
                }
                if (enemy != null)
                {
                    ShootBullet(enemy);
                }
            }

            // Basic management of enemies and collision of bullets
            List <EnemyCoord> deadEnemies = new List <EnemyCoord>();
            bool killed = true;

            // Checking the move direction of the enemy group
            if (moveDirection == MoveDirection.RIGHT)
            {
                for (int j = 10; j >= 0; --j)
                {
                    for (int k = 4; k >= 0; --k)
                    {
                        if (mEnemyArray[k][j] != null)
                        {
                            // Check if touching edge of right screen
                            if (mEnemyArray[k][j].Position.X + mEnemyArray[k][j].FrameSize > graphicsDevice.Viewport.Width)
                            {
                                mEnemyArray[k][j].Position.X = graphicsDevice.Viewport.Width - mEnemyArray[k][j].FrameSize;
                                edgeTouch     = EdgeTouch.RIGHT;
                                moveDirection = MoveDirection.DOWN;
                            }
                            mEnemyArray[k][j].Update(gameTime, moveDirection);
                            foreach (Bullet bullet in game.mPlayerSprite.mBullets)
                            {
                                if (mEnemyArray[k][j].Size.Contains(bullet.Position.X + bullet.FrameSize / 2, bullet.Position.Y))
                                {
                                    deadEnemies.Add(new EnemyCoord(k, j));
                                    game.mPlayerSprite.mDeadBullets.Add(bullet);
                                    if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader1")
                                    {
                                        game.score += 30;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader2")
                                    {
                                        game.score += 20;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader3")
                                    {
                                        game.score += 10;
                                    }
                                }
                            }
                            killed = false;
                        }
                    }
                }
            }
            else if (moveDirection == MoveDirection.DOWN)
            {
                for (int j = 10; j >= 0; --j)
                {
                    for (int k = 4; k >= 0; --k)
                    {
                        if (mEnemyArray[k][j] != null)
                        {
                            // Check if moved one enemy down
                            if ((int)mEnemyArray[k][j].Position.Y % 8 == 0)
                            {
                                // Check if enemy is touching right side of screen
                                if (edgeTouch == EdgeTouch.RIGHT)
                                {
                                    moveDirection = MoveDirection.LEFT;
                                    edgeTouch     = EdgeTouch.NONE;
                                }
                                // Check if enemy is touching left side of screen
                                else if (edgeTouch == EdgeTouch.LEFT)
                                {
                                    moveDirection = MoveDirection.RIGHT;
                                    edgeTouch     = EdgeTouch.NONE;
                                }
                            }
                            mEnemyArray[k][j].Update(gameTime, moveDirection);
                            foreach (Bullet bullet in game.mPlayerSprite.mBullets)
                            {
                                if (mEnemyArray[k][j].Size.Contains(bullet.Position.X + bullet.FrameSize / 2, bullet.Position.Y))
                                {
                                    deadEnemies.Add(new EnemyCoord(k, j));
                                    game.mPlayerSprite.mDeadBullets.Add(bullet);
                                    if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader1")
                                    {
                                        game.score += 30;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader2")
                                    {
                                        game.score += 20;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader3")
                                    {
                                        game.score += 10;
                                    }
                                }
                            }
                            killed = false;
                        }
                    }
                }
            }
            else if (moveDirection == MoveDirection.LEFT)
            {
                for (int j = 0; j < 11; ++j)
                {
                    for (int k = 4; k >= 0; --k)
                    {
                        if (mEnemyArray[k][j] != null)
                        {
                            // Check if touching edge of left screen
                            if ((int)mEnemyArray[k][j].Position.X < 0)
                            {
                                mEnemyArray[k][j].Position.X = 0;
                                edgeTouch     = EdgeTouch.LEFT;
                                moveDirection = MoveDirection.DOWN;
                            }
                            mEnemyArray[k][j].Update(gameTime, moveDirection);
                            foreach (Bullet bullet in game.mPlayerSprite.mBullets)
                            {
                                if (mEnemyArray[k][j].Size.Contains(bullet.Position.X + bullet.FrameSize / 2, bullet.Position.Y))
                                {
                                    deadEnemies.Add(new EnemyCoord(k, j));
                                    game.mPlayerSprite.mDeadBullets.Add(bullet);
                                    if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader1")
                                    {
                                        game.score += 30;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader2")
                                    {
                                        game.score += 20;
                                    }
                                    else if (mEnemyArray[k][j].ENEMY_ASSETNAME == "invader3")
                                    {
                                        game.score += 10;
                                    }
                                }
                            }
                            killed = false;
                        }
                    }
                }
            }

            if (killed)
            {
                game.winState = Game1.WinState.VICTORY;
            }

            // Remove dead enemies from the enemy array
            foreach (EnemyCoord coord in deadEnemies)
            {
                mEnemyArray[coord.X][coord.Y] = null;
            }

            // Check if enemy bullets have touched shield
            foreach (Bullet bullet in mBullets)
            {
                foreach (Shield shield in game.mShieldSprites)
                {
                    if (shield.Size.Contains(bullet.Position.X + bullet.FrameSize / 2, bullet.Position.Y))
                    {
                        mDeadBullets.Add(bullet);
                    }
                }
                // Check if enemy bullets have touched the player
                if (game.mPlayerSprite.Size.Contains(bullet.Position.X + bullet.FrameSize / 2, bullet.Position.Y))
                {
                    mDeadBullets.Add(bullet);
                    game.winState = Game1.WinState.GAME_OVER;
                }
            }

            // Remove bullets that have been hit by the enemy from the player sprite
            foreach (Bullet bullet in game.mPlayerSprite.mDeadBullets)
            {
                game.mPlayerSprite.mBullets.Remove(bullet);
            }

            // Remove bullets that collided with the shield
            foreach (Bullet bullet in mDeadBullets)
            {
                mBullets.Remove(bullet);
            }
        }