//Gère l'affichage de la liste d'IA public void swap(ref IA a, ref IA b) { IA c = a; a = b; b = c; }
public void tri(ref IA[] tableau) { int i = 0; while (i < tableau.Length) { swap(ref tableau[i], ref tableau[minimum(tableau, i, tableau.Length)]); i++; } }
public int minimum(IA[] tableau, int d, int f) { int pos = d; int i = d + 1; while (i < tableau.Length) { if (tableau[i].IATexture.Y < tableau[pos].IATexture.Y) { pos = i; } i++; } return pos; }
public void draw_ordre(SpriteBatch spriteBatch) { IA[] tableau_ia = new IA[liste_ia.Count]; liste_ia.CopyTo(tableau_ia); tri(ref tableau_ia); foreach (Player joueur in liste_joueurs) { joueur.est_afficher = false; } foreach (IA ia in tableau_ia) { foreach (Player joueur in liste_joueurs) { if ((ia.IATexture.Y > joueur.PlayerTexture.Y) && !joueur.est_afficher) { joueur.Draw(spriteBatch, MapTexture); joueur.est_afficher = true; } ia.Draw(spriteBatch, MapTexture); } } foreach (Player joueur in liste_joueurs) { if (!joueur.est_afficher) { joueur.Draw(spriteBatch, MapTexture); joueur.est_afficher = true; } } }
//Gère le raffraichissement de la liste d'IA public void update_ia() { foreach (IA ia in liste_ia) //Pour chaque IA de la liste { if (ia.Health > 0) { ia.est_update = true; //Précise que l'on travaille sur la liste this.ia = ia; float distance = 10000; Vector2 vector_ia = new Vector2(ia.IATexture.X, ia.IATexture.Y); Player joueur_cible = new Player(Keys.Up, Keys.Down, Keys.Right, Keys.Left, Keys.S, Keys.P, Keys.Enter, Keys.T, Ressources.Player1, parametre.x, parametre.y); Vector2 vector_joueur = new Vector2(); foreach (Player joueur in liste_joueurs) { joueur_cible = joueur; vector_joueur = new Vector2(joueur_cible.PlayerTexture.X, joueur_cible.PlayerTexture.Y); } Vector2.Distance(ref vector_ia, ref vector_joueur, out distance); foreach (Player joueur in liste_joueurs) { vector_joueur = new Vector2(joueur.PlayerTexture.X, joueur.PlayerTexture.Y); float distance_2; Vector2.Distance(ref vector_ia, ref vector_joueur, out distance_2); if (distance_2 < distance) { distance = distance_2; joueur_cible = joueur; } } //L'ensemble des commandes précédentes définissent quel héros est la cible, ici le plus proche /* Node départ = new Node(); départ.x = (this.ia.IATexture.X + 8) / 16; départ.y = (this.ia.IATexture.Y + 8) / 16; Node arrivée = new Node(); arrivée.x = (joueur_cible.PlayerTexture.X + 8) / 16; arrivée.y = (joueur_cible.PlayerTexture.Y + 8) / 16; bool[,] map = map_physique.map();*/ /* this.ia.action = Pathfinding.pathfind(map, départ, arrivée); */ if (ia.ia_vol) { pathfing_vol(ref this.ia.action, joueur_cible); } else { pathfing(ref this.ia.action, joueur_cible); } //Trouve quelle action va faire l'IA ia.action_ia(ia, joueur_cible, liste_barrel, map_physique, liste_ia, liste_joueurs); //Verifie la possibilité de réalisation des actions ia.Update(); //Met à jour l'IA ia.attaque_ia(liste_joueurs); ia.est_update = false; //Désactive l'update de l'IA } else { ia.en_vie = false; //Tue l'IA compteur_kill++; AddBloodEffect(new Vector2(ia.IATexture.X, ia.IATexture.Y), ia.IATexture.X, ia.IATexture.Y, 1); moteur_son.PlayBloodEffect(); } } if (compteur > 180 && etape1) //Ajout de nouvelles IA a la map { int choix = rand0.Next(spawns.Count); Spawn spawn = spawns.ElementAt(choix); choix = rand0.Next(spawn.créatures.Count); IA ia = spawn.créatures.ElementAt(choix); IA ia_ = new IA(ia.IATexture.X, ia.IATexture.Y, ia.id_son, ia.id_texture, ia.Health, ia.Damage); float distance = 10000; Vector2 vector_ia = new Vector2(ia_.IATexture.X, ia_.IATexture.Y); Player joueur_cible = new Player(Keys.Up, Keys.Down, Keys.Right, Keys.Left, Keys.S, Keys.P, Keys.Enter, Keys.T, Ressources.Player1, parametre.x, parametre.y); Vector2 vector_joueur = new Vector2(); foreach (Player joueur in liste_joueurs) { joueur_cible = joueur; vector_joueur = new Vector2(joueur_cible.PlayerTexture.X, joueur_cible.PlayerTexture.Y); } Vector2.Distance(ref vector_ia, ref vector_joueur, out distance); foreach (Player joueur in liste_joueurs) { vector_joueur = new Vector2(joueur.PlayerTexture.X, joueur.PlayerTexture.Y); float distance_2; Vector2.Distance(ref vector_ia, ref vector_joueur, out distance_2); if (distance_2 < distance) { distance = distance_2; } } if (distance < 400) { bool test = true; foreach (IA ia__ in liste_ia) { if (ia__.IATexture.Intersects(ia_.IATexture)) { test = false; } else { } } if (test) { liste_ia.Add(ia_); if (true) { moteur_son.PlayPika(ia_.id_son); } joue_son = !joue_son; compteur = 0; } } } compteur = compteur + 1; liste_ia2 = new List<IA>(); //Recopie la liste d'IA encore en vie dans une nouvelle liste foreach (IA ia in liste_ia) { if (ia.en_vie) liste_ia2.Add(ia); } liste_ia = liste_ia2; //Vide la liste secondaire dans la premiere }
public bool collision_entite_ia(IA ia, List<IA> liste_ia, List<Player> liste_joueurs) { Rectangle futur_rectangle = ia.rectangle(); bool test = true; foreach (IA ia1 in liste_ia) { if ((test) && !(ia1.est_update)) { test = !futur_rectangle.Intersects(ia1.rectangle()); //Teste l'intersection entre une IA (parametre) et les autres (foreach) à l'aide de rectangle } } foreach (Player joueur in liste_joueurs) { if (test) { test = !futur_rectangle.Intersects(joueur.rectangle()); //Teste l'intersection entre une IA (parametre) et les héros (foreach) à l'aide de rectangle } } return test; }
public void action_ia(IA ia, Player joueur, List<DestructibleItems> liste_barrel, PhysicsEngine map_physique, List<IA> liste_ia, List<Player> liste_joueur) { foreach (DestructibleItems barrel in liste_barrel) { if (barrel.Aire_barrel.Intersects(ia.rectangle()) && barrel.type == "barrel") { ia.actionIA = ""; } } if (ia.actionIA == "up" || ia.actionIA == "down" || ia.actionIA == "left" || ia.actionIA == "right") { if (!ia.ia_vol) { if (ia.actionIA == "up") { if (!(map_physique.mur(ia.futur_position_X_gauche(), ia.futur_position_Y_haut())) && !(map_physique.mur(ia.futur_position_X_droite(), ia.futur_position_Y_haut())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "down") { if (!(map_physique.mur(ia.futur_position_X_gauche(), ia.futur_position_Y_bas())) && !(map_physique.mur(ia.futur_position_X_droite(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "left") { if (!(map_physique.mur(ia.futur_position_X_gauche(), ia.futur_position_Y_haut())) && !(map_physique.mur(ia.futur_position_X_gauche(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "right") { if (!(map_physique.mur(ia.futur_position_X_droite(), ia.futur_position_Y_haut())) && !(map_physique.mur(ia.futur_position_X_droite(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } } else { if (ia.actionIA == "up") { if (!(map_physique.mur_projectile(ia.futur_position_X_gauche(), ia.futur_position_Y_haut())) && !(map_physique.mur_projectile(ia.futur_position_X_droite(), ia.futur_position_Y_haut())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "down") { if (!(map_physique.mur_projectile(ia.futur_position_X_gauche(), ia.futur_position_Y_bas())) && !(map_physique.mur_projectile(ia.futur_position_X_droite(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "left") { if (!(map_physique.mur_projectile(ia.futur_position_X_gauche(), ia.futur_position_Y_haut())) && !(map_physique.mur_projectile(ia.futur_position_X_gauche(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } if (ia.actionIA == "right") { if (!(map_physique.mur_projectile(ia.futur_position_X_droite(), ia.futur_position_Y_haut())) && !(map_physique.mur_projectile(ia.futur_position_X_droite(), ia.futur_position_Y_bas())) && collision_entite_ia(ia, liste_ia, liste_joueur)) ia.mise_a_jour(ia.actionIA); else ia.actionIA = ""; } } } ia.actionIA = ""; //"Remet à zéros" les actions de l'IA }