samedi 22 novembre 2008

Dev - Un ennemi plus intelligent

Bonsoir à tous!

Je me suis enfin décidé à faire un article après une assez longue absence. Je parlerais donc ici d'un nouvel ennemi que j'ai crée pour mon jeu et qui possède la particularité de ne pas tomber d'une plateforme lorsque celui-ci atteint le bord. Il préfère faire un demi-tour afin de mieux vous persécuter. Voici donc mon raisonnement :

Mon ennemi se déplace normalement. il détecte si un sol se trouve en dessous de lui, et agit en conséquence : il arrête de tomber. Maintenant, réfléchissons : pourquoi cet ennemi tombe t-il? Réponse : parce qu'il y a une gravité et qu'il n'y a pas de sol en dessous de lui. On peut donc prévoir si l'ennemi tombera ou pas à la prochaine exécution du code : il suffit de tester, en plus du sol en dessous de lui, celui qui se trouve juste devant. On obtient donc un pseudo-code du genre :

if (soldevant=1) ennemi->vitesse*=-1;



Maintenant, voyons comment mettre cela en application en prenant comme base les fonctions de détection de collisions fournies sur ce wiki.

On détecte d'abord le sol à gauche du sprite avec ceci :

(GetTile(fix_norm(bady->x)-2, fix_norm(bady->y)+bady->height)==0)


Puis à gauche avec :

(GetTile(fix_norm(bady->x)+bady->weight, x_norm(bady->y)+bady->height)==0)


On s'aperçoit en testant que ces collisions sont testées en permanence : or, on a seulement besoin de les tester si l'ennemi se déplace dans la bonne direction. Ainsi, on ajoute à la condition :

( (GetTile(fix_norm(bady->x)-2, fix_norm(bady->y)+bady->height)==0) && (bady->variables<0)


et

( (GetTile(fix_norm(bady->x)+bady->weight, fix_norm(bady->y)+bady->height)==0) && bady->variables>0) )


Je précise que bady->variables correspond à la vitesse du personnage.

Voila, on a maintenant un ennemi qui ne tombe pas des plateformes.