/// <summary> /// Fonction dont le rôle est de faire jouer le son d'explosion de l'ennemi /// et de préparer le visuel de celle-ci /// </summary> /// <param name="gw"></param> public void PlayDeath(GW gw) { //Jouer l'effet sonore explodeMusic.Play(); //Effet visuel de destruction for (int i = 0; i < 360; i++) { gw.AddParticle(new Particle(Position.X, Position.Y, 4, new Color(enemyColor.R, enemyColor.G, enemyColor.B, (byte)rnd.Next(25, 255 + 1)), 5.35f, 0.75f, i)); } }
/// <summary> /// Méthode dont le rôle est de mettre à jour le projectile et de dire au jeu s'il /// peut supprimer le projectile ou non /// </summary> /// <param name="deltaT">La vitesse de rafraichissement du jeu</param> /// <param name="gw">Instance représentant le jeu</param> /// <returns>Booléen indiquant si le projectile peut être détruit(FALSE) ou non(TRUE)</returns> public bool Update(Single deltaT, GW gw) { //Si le projectile sort de la limite du jeu, alors retirer celui-ci du jeu if (gw.Contains(this) == false) { return(false); } //Sinon, on ajoute de nouvelles particules tout en le faisant avancer. else { gw.AddParticle(new Particle(Position.X, Position.Y, 4, new Color(color.R, color.G, color.B, (byte)rnd.Next(25, 255 + 1)), 5.35f, 0.55f, -rnd.Next(180 - (int)Angle - 5, 180 - (int)Angle + 5 + 1))); Advance(ProjectileSpeed); return(true); } }
/// <summary> /// Fonction dont le rôle est d'interprêter les commandes entrées par l'utilisateur et /// de mettre le joueur à jour en fonction de celles-cis. Le visuel et du joueur et la /// validation du booléen "isAlive" reposent aussi sur cette fonction. /// </summary> /// <param name="deltaT">Vitesse de rafraichissement du jeu</param> /// <param name="gw">Représente l'instance du jeu</param> /// <returns>Booléen indiquant si le joueur est en vie(TRUE) ou non(FALSE)</returns> public bool Update(Single deltaT, GW gw) { //Initialisation de l'effet de particule gw.AddParticle(new Particle(Position.X, Position.Y, 4, new Color(HeroColor.R, HeroColor.G, HeroColor.B, (byte)rnd.Next(25, 255 + 1)), 5.35f, 1.25f, -rnd.Next(180 - (int)Angle - 5, 180 - (int)Angle + 5 + 1))); //Passif if (gw.PlayerIdle) { Advance(2); } //Accélération if (Keyboard.IsKeyPressed(Keyboard.Key.Up) || Keyboard.IsKeyPressed(Keyboard.Key.W)) { Advance(4.50f); } //Reculons if (Keyboard.IsKeyPressed(Keyboard.Key.Down) || Keyboard.IsKeyPressed(Keyboard.Key.S)) { Advance(-4.50f); } //Rotation anti-horaire if (Keyboard.IsKeyPressed(Keyboard.Key.Left) || Keyboard.IsKeyPressed(Keyboard.Key.A)) { Rotate(-4.50f); } //Rotation horaire if (Keyboard.IsKeyPressed(Keyboard.Key.Right) || Keyboard.IsKeyPressed(Keyboard.Key.D)) { Rotate(4.50f); } //Tir if (Keyboard.IsKeyPressed(Keyboard.Key.Space)) { Fire(gw, deltaT); } //Lancé de bombe if (Keyboard.IsKeyPressed(Keyboard.Key.Return)) { FireBomb(gw); } //Vérifier si le joueur est toujours en vie isAlive = this.Life > 0; return(isAlive); }
/// <summary> /// Fonction dont le rôle est d'assurer le comportement de l'ennemi de base en toutes /// cirsonstances. L'ennemi suivra un parcourt aléatoire lorsqu'il ne détectera pas le /// joueur et foncera sur celui-ci s'il le perçoit tout en ouvrant le feu. Retourner VRAI /// si l'ennemi est toujours considéré comme vivant. /// </summary> /// <param name="deltaT">Représente la vitesse de rafraichissement du jeu</param> /// <param name="gw">Représente le jeu</param> /// <returns>Vaux VRAI si l'ennemi est toujours considéré comme viable et FAUX dans le cas contraire</returns> public override bool Update(Single deltaT, GW gw) { //Initialisation de l'effet de particule gw.AddParticle(new Particle(Position.X, Position.Y, 4, new Color(enemyColor.R, enemyColor.G, enemyColor.B, (byte)rnd.Next(25, 255 + 1)), 5.35f, 0.55f, -rnd.Next(180 - (int)Angle - 5, 180 - (int)Angle + 5 + 1))); //En stade de spawn... if (IsSpawning) { Advance(1.50f); if (DateTime.Now >= timeSpawn) { spawnMusic.Play(); IsSpawning = false; //Trouver une cible aléatoire cible = new Vector2f(rnd.Next(15, GW.WIDTH - 50), rnd.Next(15, GW.HEIGHT - 50)); angleCible = TargetAngle(cible); timeInvMax = new DateTimeOffset(DateTime.Now.AddSeconds(3.40f)); } } //En stade de repérage if (DateTime.Now > timeChase) { BasicEnemySpeed = 0.17f; if (this.Position.X >= cible.X - 5 && this.Position.X <= cible.X + 5 && this.Position.Y >= cible.Y - 5 && this.Position.Y <= cible.Y + 5 || DateTime.Now > timeInvMax) { timeInvMax = DateTime.Now.AddSeconds(rnd.Next(2, 4)); cible = new Vector2f(rnd.Next(30, GW.WIDTH - 30), rnd.Next(30, GW.HEIGHT - 30)); angleCible = TargetAngle(cible); } if (Angle > angleCible) { Rotate(-BasicEnemySpeed); } else if (Angle < angleCible) { Rotate(BasicEnemySpeed); } if (Angle < TargetAngle(gw.hero.Position) + 10 && Angle > TargetAngle(gw.hero.Position) - 10) { timeChase = DateTime.Now.AddSeconds(rnd.Next(6, 15 + 1)); } Advance(BasicEnemySpeed); } //En stade de tir else if (DateTime.Now < timeChase) { BasicEnemySpeed = 0.50f; float angleCible = TargetAngle(gw.hero.Position); if (Angle > angleCible + 12) { Rotate(-90 * deltaT); } else if (Angle < angleCible - 12) { Rotate(90 * deltaT); } else if (rnd.Next(0, 45 + 1) == 1) { for (int i = 0; i < 4; i++) { fireSound.Play(); gw.AddProjectile(new Projectile(CharacterType.ENNEMI, Position.X, Position.Y, 4, enemyColor, 7.50f, 360 / this.Size / 2, 0)); gw.AddProjectile(new Projectile(CharacterType.ENNEMI, Position.X, Position.Y, 4, enemyColor, 7.50f, 360 / this.Size / 2, 90)); gw.AddProjectile(new Projectile(CharacterType.ENNEMI, Position.X, Position.Y, 4, enemyColor, 7.50f, 360 / this.Size / 2, 180)); gw.AddProjectile(new Projectile(CharacterType.ENNEMI, Position.X, Position.Y, 4, enemyColor, 7.50f, 360 / this.Size / 2, 270)); } } Advance(BasicEnemySpeed); } return(true); }
/// <summary> /// Fonction dont le rôle est d'assurer le comportement de l'ennemi de base en toutes /// cirsonstances. L'ennemi suivra un parcourt aléatoire lorsqu'il ne détectera pas le /// joueur et foncera sur celui-ci s'il le perçoit tout en ouvrant le feu. Retourner VRAI /// si l'ennemi est toujours considéré comme vivant. /// </summary> /// <param name="deltaT">Représente la vitesse de rafraichissement du jeu</param> /// <param name="gw">Représente le jeu</param> /// <returns>Vaux VRAI si l'ennemi est toujours considéré comme viable et FAUX dans le cas contraire</returns> public override bool Update(Single deltaT, GW gw) { //Initialisation de l'effet de particule gw.AddParticle(new Particle(Position.X, Position.Y, 4, new Color(enemyColor.R, enemyColor.G, enemyColor.B, (byte)rnd.Next(25, 255 + 1)), 5.35f, 0.55f, -rnd.Next(180 - (int)Angle - 5, 180 - (int)Angle + 5 + 1))); //En stade de spawn... if (IsSpawning) { Advance(1.50f); if (DateTime.Now >= timeSpawn) { spawnMusic.Play(); IsSpawning = false; //Trouver une cible aléatoire cible = new Vector2f(rnd.Next(15, GW.WIDTH - 50), rnd.Next(15, GW.HEIGHT - 50)); angleCible = TargetAngle(cible); timeInvMax = new DateTimeOffset(DateTime.Now.AddSeconds(3.40f)); } } //En stade de repérage if (DateTime.Now > timeChase) { BasicEnemySpeed = 0.75f; if (canExplode) { canExplode = false; } if (Color.R != 63) { if (Color.R > 63) { enemyColor.R -= (byte)1; Color = enemyColor; } else if (Color.R < 63) { enemyColor.R += (byte)1; Color = enemyColor; } } if (this.Position.X >= cible.X - 5 && this.Position.X <= cible.X + 5 && this.Position.Y >= cible.Y - 5 && this.Position.Y <= cible.Y + 5 || DateTime.Now > timeInvMax) { timeInvMax = DateTime.Now.AddSeconds(rnd.Next(2, 4)); cible = new Vector2f(rnd.Next(30, GW.WIDTH - 30), rnd.Next(30, GW.HEIGHT - 30)); angleCible = TargetAngle(cible); } if (Angle > angleCible) { Rotate(-BasicEnemySpeed); } else if (Angle < angleCible) { Rotate(BasicEnemySpeed); } if (Angle < TargetAngle(gw.hero.Position) + 10 && Angle > TargetAngle(gw.hero.Position) - 10 && Math.Abs(Position.X) + 5 >= Math.Abs(gw.hero.Position.X) && Math.Abs(Position.Y) + 5 >= Math.Abs(gw.hero.Position.Y)) { timeChase = DateTime.Now.AddSeconds(rnd.Next(12, 15 + 1)); } Advance(BasicEnemySpeed); } //En stade de chasse else if (DateTime.Now < timeChase) { canExplode = true; BasicEnemySpeed = 0.75f; if (Color.R != 191) { if (Color.R > 191) { enemyColor.R -= (byte)1; Color = enemyColor; } else if (Color.R < 191) { enemyColor.R += (byte)1; Color = enemyColor; } //Tirer de façons aléatoire for (int i = 0; i < 2; i++) { gw.AddProjectile(new Projectile(CharacterType.ENNEMI, Position.X, Position.Y, 4, enemyColor, 5.00f, this.Size / 100, rnd.Next(0, 360 + 1))); } } } return(true); }