Programmation Orientée Jeux

Les Jeux de Plateforme - Les Monstres

Comment gérer les Monstres ?

Pour les ennemis, il s'agit de stocker coordonnées, et numéro d'ennemi (si on commence à vouloir stocker directement les informations de chaque ennemis, on prendra de la place inutilement). Il faut pour cela que le programme soit capable de retrouver les informations de l'ennemi à partir d'un numéro (par exemple, on met dans un dossier le sprite animé, et un fichier contenant les informations). Cela revient un peu à une mini base de données. Ainsi, lorsque l'on chargera le niveau, il suffira d'aller chercher les informations correspondant à l'ennemi chargé (telles que ses dimensions, ses animations, sa vitesse...). Sa position doit correspondre à une coordonnée sur la Map.

1) Un exemple

Prenons par exemple ce monstre:

Ennemi

Et les données qui l'accompagnent: (dans un fichier *.txt pour faciliter leurs manipulations)

=STR= #NAME#         = {Crawling} // Nom de l'ennemi
=RNG= #FRAMES#       = {04-04} // Frames horizontales - Frames verticales
// Donnees d'animation
=ANM= #IDLE#         = {01-01}
=ANM= #WALK#         = {01-08}
=ANM= #TURN#         = {09-12}
=ANM= #JUMP#         = {13-15}
=ANM= #FALL#         = {16-16}

On remarque facilement que l'animation du monstre se décompose en 5 parties:

Ces états sont constitués d'un intervalle, qui correspond aux animations de ces états (première frame - dernière frame). Les données sont écrites en texte directement, afin qu'elles soient modifiables facilement (on aurait pu aussi utiliser le format XML). Pour en revenir à l'organisation de la mini base de données (afin d'indexer par numéro chaque ennemi), il suffit par exemple de mettre dans un dossier, tous les ennemis, par ordre de numéro croissant (1.png 1.txt 2.png 2.txt ... n.png n.txt). Ainsi il est très facile d'associer un fichier de données à une image contenant les animations.

2) Un automate

Maintenant, il faut penser à une chose... c'est que généralement, il n'existe pas qu'un type d'ennemi. En outre, ils ne font pas la même chose, bien qu'il aient une base commune. L'idée est donc d'écrire une classe d'ennemi qui réalisera les actions communes à tous les ennemis susceptibles d'exister (chargement des données généralement, et affichage). Ensuite, chaque nouvel ennemi pourra hériter de cette classe, et y ajouter ses propres actions (qui diffère des autres). Ainsi, on trouvera dans chaque classe, un code unique, sans redondance (à priori).

Le but sera donc de créer un semblant d'intelligence (états déterministes, calculables), dépendants ou non du joueur. Par exemple, lorsque le joueur se trouve à une certaine distance d'un monstre, il vous attaque, ou il avance pour vous attaquer, ou il attaque à distance si il le peut. Bref, ceci n'est en fait qu'un test de condition, et si elle est rempli, il se passe ce qui est défini.

Afin de faciliter la création de notre 'monstre', il va falloir dans un premier temps définir plusieurs états, et comment ils sont atteints:

Automate

Voilà comment on pourrait résumer de manière simple notre 'monstre'. Le mode patrouille est l'état par défaut, lorsque le joueur ne se trouve pas dans la zone de détection d'un ennemi. L'attaque serait lorsque le joueur se trouve à une certaine distance (définie comme visible par l'ennemi), et la défense lorsque l'ennemi n'a plus beaucoup de vie.

Maintenant, plus délicat, nous allons voir comment détecter ces 3 états. Pour savoir si l'ennemi est en patrouille, il faut réaliser un test de collision. On peut par exemple représenter le champs de vision d'un ennemi par un trait. Lorsque le joueur se trouve à une certaine distance
(d² = (x'-x)² + (y'-y)²) de l'ennemi, on trace un ligne virtuelle entre le joueur et ce dernier, et on vérifie qu'il n'y ai pas d'intersection avec un Tile (élément de la Map). Si il n'y a pas d'intersection, alors l'état attaque peut être activé, sinon c'est patrouille. On constatera pas la suite qu'il s'agit surtout de tests de collision (même chose en 3D).

Règles

Il est aussi possible de se passer de tous ces tests, en se contentant de faire bouger l'ennemi de droite à gauche par exemple, et de tester si on le touche ou non (collision). Dans ce cas, il suffira de faire avancer l'ennemi à gauche, jusqu'à son extrémité autorisée, puis de le faire repartir à droite, jusqu'à son autre extrémité, et ainsi de suite...


Lire la suite: Les Jeux de Plateforme - Les Collisions

Programmation Orientée Jeux ©2010-2014
Byron 3D Games Studio