private void Spawn() { #region Stones // Amount of stones spawned, ServicesHelper.RandomGeneratorom number betwenn 2 and 5 int stones = ServicesHelper.RandomGenerator.Next(2, 6); int stoneType = 0; for (int i = 0; i < stones; i++) { Sprite stone; // One chance on 8 of being a diamond stoneType = ServicesHelper.RandomGenerator.Next(1, 9); // Random speed Vector2 stoneSpeed, stonePosition; if (stoneType == 1) { // Is a diamond stonePosition = new Vector2(ServicesHelper.RandomGenerator.Next(0, Game.Window.ClientBounds.Width + 1 - diamond.Width), 0); stoneSpeed = new Vector2(0, ServicesHelper.RandomGenerator.Next(3, 9)); stone = new DiamondSprite(diamond, stonePosition, stoneSpeed); } else { // Is a gem stonePosition = new Vector2(ServicesHelper.RandomGenerator.Next(0, Game.Window.ClientBounds.Width + 1 - (gem.Width / 5)), 0); stoneSpeed = new Vector2(0, ServicesHelper.RandomGenerator.Next(1, 6)); stone = new GemSprite(gem, 1, 5, stonePosition, stoneSpeed); } // Add newly created stone to the list preciousStones.Add(stone); } #endregion #region Enemies // Amount of enemies spawned, ServicesHelper.RandomGeneratorom number between 0 and 7 int numberOfEnemies = ServicesHelper.RandomGenerator.Next(0, 8); for (int i = 0; i < numberOfEnemies; i++) { // Random number for the texture of the enemy to spawn int textureIndex = ServicesHelper.RandomGenerator.Next(0, texEnnemies.Count); // Random position Vector2 enemyPosition = new Vector2(ServicesHelper.RandomGenerator.Next(0, Game.Window.ClientBounds.Width - (int)(texEnnemies[textureIndex].Width * ENEMY_SCALE)), 0); // Random speed Vector2 enemySpeed = new Vector2(0, ServicesHelper.RandomGenerator.Next(2, 8)); EnnemiSprite enemy = new EnnemiSprite(texEnnemies[textureIndex], 1, 1, enemyPosition, enemySpeed, 1, 35, ENEMY_SCALE); enemies.Add(enemy); } #endregion }
/// <summary> /// On vérifie si on peut pondre l'ennemi /// </summary> /// <param name="ennemi">Ennemi en question</param> private bool EnnemiSpawnError(EnnemiSprite ennemi) { bool error = false; foreach (EnnemiSprite e in listeEnnemis) { if (e.Collision(ennemi)) { error = true; break; } } return(error); }
/// <summary> /// Mise à jour des ennemis /// <param name="gameTime">Provides a snapshot of timing values.</param> protected void updateEnnemi(GameTime gameTime) { // Identifier les ennemis ayant quitté l'écran. List <EnnemiSprite> ennemisFini = new List <EnnemiSprite>(); foreach (EnnemiSprite ennemi in this.listeEnnemis) { if (this.camera.EstADroite(ennemi.PositionRect)) { ennemisFini.Add(ennemi); } } // Se débarrasser des ennemis ayant quitté l'écran. foreach (EnnemiSprite ennemi in ennemisFini) { this.listeEnnemis.Remove(ennemi); } // Mettre à jour les ennemis existants. foreach (EnnemiSprite ennemi in this.listeEnnemis) { ennemi.Update(gameTime, this.graphics); } // Déterminer si on doit créer un nouvel ennemi. if (this.randomEnnemis.NextDouble() < this.probEnnemis) { Random random = new Random(); EnnemiSprite ennemi = null; if (random.NextDouble() < probEnnemiType) { ennemi = new EnnemiSpinner(0, 0); } else { ennemi = new EnnemiShip(0, 0); } if (ennemi == null) { return; } ennemi.ShootObus += Shoot; ennemi.GetAngleToPlayer += AngleToPlayer; // Positionner aléatoirement le sprite au haut de l'écran. do { ennemi.Position = new Vector2(this.graphics.GraphicsDevice.Viewport.Width + ennemi.Width / 2, random.Next(ennemi.Height, this.graphics.GraphicsDevice.Viewport.Height - ennemi.Height)); } while (EnnemiSpawnError(ennemi)); // Aligner la vitesse de déplacement de l'ennemi avec celui de l'arrière-plan. ennemi.VitesseDeplacement = this.arrierePlanEspace.VitesseArrierePlan; // Ajouter le sprite à la liste d'ennemis. this.listeEnnemis.Add(ennemi); } }
/// <summary> /// Routine mettant à jour les obus. Elle s'occupe de: /// 1 - Détruire les obus ayant quitté l'écran sans collision /// 2 - Déterminer si un des obus a frappé un sprite, et si c'est le cas /// détruire les deux sprites (probablement un astéroïde) /// 3 - Mettre à jour la position des obus existants. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected void UpdateObus(GameTime gameTime) { // Identifier les obus ayant quitté l'écran. foreach (Obus obus in this.listeObusJoueur) { if (obus.Position.X + obus.Width > this.graphics.GraphicsDevice.Viewport.Width + obus.Width || obus.Position.X < 0 || obus.Position.Y < 0 || obus.Position.Y - obus.Height > this.graphics.GraphicsDevice.Viewport.Height) { listeObusFini.Add(obus); } } foreach (Obus obus in this.listeObusEnnemis) { if (obus.Position.X + obus.Width > this.graphics.GraphicsDevice.Viewport.Width - obus.Width || obus.Position.X < 0 || obus.Position.Y < 0 || obus.Position.Y - obus.Height > this.graphics.GraphicsDevice.Viewport.Height) { listeObusFini.Add(obus); } } // Determiner si un obus a frappé un astéroïde, et si c'est le cas détruire les deux sprites. foreach (Obus obus in this.listeObusJoueur) { // Premièrement, est-ce que l'obus a touché un astéroïde? EnnemiSprite cible = (EnnemiSprite)obus.Collision(this.listeEnnemis); // Si oui, détruire les deux sprites impliqués et produire une explosion if (cible != null && obus.Source != cible) { cible.Health -= obus.Damage; this.CreerExplosion(cible, this.particulesExplosions, gameTime, 0.5f); listeObusFini.Add(obus); if (cible.Health < 1) { // Détruire la cible. this.listeEnnemis.Remove(cible); points += 10f; if (points % 100 == 0) { probEnnemis += 0.005f; } // Créer un nouvel effet visuel pour l'explosion. this.CreerExplosion(cible, this.particulesExplosions, gameTime, 1f); // Activer l'effet sonore de l'explosion. bruitageExplosion.Play(0.25f, 0f, 0f); if (randomPowerup.NextDouble() <= probPowerUp) { PowerUp powerup; if (randomPowerup.NextDouble() > 0.5f) { if (probEnnemis / 0.005f == 1) { powerup = new PowerUp_One_Projectile(cible.Position); } else if (probEnnemis / 0.005f == 2) { if (randomPowerup.NextDouble() > 0.75f) { powerup = new PowerUp_One_Projectile(cible.Position); } else { powerup = new PowerUp_Two_Projectile(cible.Position); } } else { if (randomPowerup.NextDouble() > 0.5f) { powerup = new PowerUp_Three_Projectile(cible.Position); } else { if (randomPowerup.NextDouble() > 0.5f) { powerup = new PowerUp_One_Projectile(cible.Position); } else { powerup = new PowerUp_Two_Projectile(cible.Position); } } } } else { if (randomPowerup.NextDouble() > 0.5f) { powerup = new PowerUp_Fire_Shot(cible.Position); } else { powerup = new PowerUp_Energy_Ball(cible.Position); } } this.listePowerUp.Add(powerup); } } } } foreach (Obus obus in this.listeObusEnnemis) { if (!vaisseauJoueur.IsRespawned && obus.Collision(this.vaisseauJoueur) && obus.Source != vaisseauJoueur) { vaisseauJoueur.Health -= obus.Damage; this.CreerExplosion(vaisseauJoueur, this.particulesExplosions, gameTime, 0.5f); // Détruire la cible et l'obus. //this.listeEnnemis.Remove(cible); listeObusFini.Add(obus); if (vaisseauJoueur.Health < 1) { vaisseauJoueur.IsRespawned = true; this.vaisseauJoueur.NbVies -= 1; // Créer un nouvel effet visuel pour l'explosion. this.CreerExplosion(vaisseauJoueur, this.particulesExplosions, gameTime, 1f); this.vaisseauJoueur.Position = this.vaisseauJoueur.PositionInitiale; // Activer l'effet sonore de l'explosion. bruitageExplosion.Play(0.25f, 0f, 0f); } } } // Se débarasser des obus n'étant plus d'aucune utilité. foreach (Obus obus in listeObusFini) { if (obus.Source == vaisseauJoueur) { this.listeObusJoueur.Remove(obus); } else { this.listeObusEnnemis.Remove(obus); } } // Mettre à jour les obus existants. foreach (Obus obus in this.listeObusJoueur) { obus.Update(gameTime, this.graphics); } foreach (Obus obus in this.listeObusEnnemis) { obus.Update(gameTime, this.graphics); } }