Intelligence artificielle
Jeudi, 02 Juillet 2009 15:27

Avant propos

Comme vous l’aurez-vu dans les pages précédentes, le but du jeu est d’anéantir les hordes d’ennemis nous poursuivant. Pour cela, les ennemis doivent se déplacer en évitant les obstacles, attaquer et fuir si besoin. Il fallait donc pour gérer cette partie une Intelligence Artificielle.

Que gère notre IA ?

  • Le déplacement des ennemis du niveau (se déplacer vers un point ou à la position de notre personnage en évitant les obstacles)
  • Le comportement des ennemis (attaquer, fuir, patrouiller)
  • La réapparition des ennemis

Comment ces actions sont-elles gérées ?

L’IA devait gérer la possibilité d’avoir plusieurs niveaux différents. Les ennemis auraient donc plusieurs mondes avec à chaque niveau des obstacles et des points de passage variables.

Pour indiquer à notre IA les obstacles, nous avons pensé à créer ce que l’on a appelé une mapIA. Cette mapIA est une image bitmap de taille 256x256 qui représente une vue de dessus de notre niveau.

Ci-dessous la mapIA de notre niveau Sphinx.

Cette image contient 3 couleurs. Le noir, blanc et la couleur rouge.

  • La couleur blanche représente la zone où il est interdit à l’IA de se rendre
  • La couleur noir représente donc les endroits de la carte où les ennemis peuvent se rendre
  • Nous verrons par la suite la signification des points rouges

Gestion des déplacements

Passons à une explication un peu plus « technique ». Le déplacement des ennemis. A la création de notre niveau, la librairie IA va charger la mapIA correspondante. Cette image va être lue pixel par pixel. Ces pixels vont être transformés en un tableau boolean de taille 256x256 avec 0 s’il n’y a pas d’obstacle et 1 si il y en a un.

Pour choisir le déplacement de l’ennemi, nous exécutons un algorithme sur ce même tableau pour trouver un chemin (le plus court possible). Nous avons choisi l’algorithme nommé AStar (ou A*) pour sa vitesse d’exécution. En effet, nous aurions pu choisir l’algorithme de Dijkstra qui trouve toujours le meilleur chemin, mais il met plus de temps à s’exécuter. Ayant prévu de calculer les chemins les plus courts pour le plus d’ennemies possible nous avons donc opté pour AStar qui ne trouve pas toujours le meilleur chemin mais qui est plus rapide à exécuter et donc plus approprié à du temps réel.

Après avoir exécuté cet algorithme, nous récupérons une liste de point que l’ennemi devra parcourir avant d’arriver à destination.

Gestion des états

Voyons maintenant comment nous avons géré les différentes attitudes de nos ennemis. En fait, le choix de l’attitude se fait d’une façon très simple. Un ennemi possède un état qui va changer en fonction de différents facteurs.

Dans notre système d’IA, un ennemi à 3 états : la patrouille, l’attaque, la fuite.

  • Si l’ennemi se trouve à une distance inférieur à une distance choisi (par exemple si vous vous trouvez a 30m de l’ennemi), l’ennemi va vous détecter et va donc passer à l’attaque
  • Si il est a une distance assez proche pour taper il va le faire, sinon il se rapproche
  • En dessous d’un certain seuil de vie, l’ennemi va de même passer en mode fuite et s’éloigner de vous
  • Enfin si l’ennemi ne se trouve pas dans votre champ de vision, l’ennemi va patrouiller

Il est possible de défini à la création de l’IA, trois modes de jeu. Le mode « normal », celui-ci-dessus, le mode « only attaque » ou l’ennemi combattra jusqu'à sa mort et le mode « only evade » ou l’ennemi s’enfuira des que vous vous approcherez de lui (vous pourrez toujours le rattraper il court moins vite...).

Gestion des réapparitions des ennemies (respawn)

Comme nous l’avons vu ci-dessus, la mapIA possède aussi une couleur rouge. Les points de couleur rouge représentent les endroits où les monstres devront réapparaitre. A la création de l’IA, il est possible de définir si les ennemies réapparaitront à l’infini, ou si dès le début on applique un nombre précis d’ennemi et le jeu s’arrête à la mort de tous les ennemis présent sur la map.

Dans le mode ou les ennemies réapparaitront, dès qu’un ou plusieurs ennemis meurent, l’IA prend au hasard un point de réapparition, et l’ennemi est créé à cette endroit.

L’intégration dans le reste du projet

Pour que l’IA marche dans notre moteur, il faut instancier l’IA puis la mettre à jour.

Les options prévues à la création de l’IA sont :

  • Activé ou non la réapparition infini
  • Le type d’attitude des IA (normal, onlyevade, onlyattaque)
  • La distance à laquelle les ennemies nous vois et donc commence à s’approcher pour attaquer
  • La distance d’attaque (ou l’ennemi frappe)
  • Le nombre maximum d’ennemi présent en même temps sur la carte
  • La taille de la carte (pour transformer la vue de dessus en coordonnées 3D standard)

Pour la mise à jour, il faut passer la liste des ennemis ainsi que la position de notre héros à l’update.

Pour pas qu’il n’y est de problème d’intégration entre l’IA et la physique (les deux modules déplacent les ennemies : la physique pourrait déplacer/pousser/faire tomber un ennemi), la physique déplace si nécessaire les ennemies, et l’IA appelé derrière calcul le nouveau trajet à effectué.