vendredi, mai 16, 2008

Faut que je repense les test-points

Bon, Bilou saute, il tombe, il rebondit ... tout ça c'est bien joli, mais il a tendance à se retrouver un peu trop souvent dans les murs à mon goût. Et en plus, son comportement devient un peu trop complexe à exprimer dans mon modèle de machines d'état. Pensez un peu. Rien que pour le saut, il me faudrait pas moins de 10 états si je veux que Bilou se "souvienne" de la dernière direction dans laquelle il est allé :P

Great. Bilou jumps, Bilou falls and bounce. It's all nice and funny, but he ends up into walls a bit too often to my tastes. Moreover, it's getting too complicated to express his behaviour only through that state machine approach: only jumping takes up to 10 states if we want to remember the last direction Bilou has been leading to ^^"

One of the reason why it's getting so complicated is that when jumping forward, there are additional testpoints to be checked, while these testpoints are disabled when jumping simply "upwards". The solution would be relatively straightforward: i need a new class of testpoints that would be conditionnal on horizontal speed.
Une des raisons de toutes ces complications, c'est que lorsqu'il saute vers l'avant, Bilou doit vérifier deux testpoints de plus (pour éviter de rentrer dans un mur) mais que ces testpoints ne sont pas souhaités lorsque le saut est simplement vertical (sinon, on ne peut pas sauter le long d'un mur ^^"). La solution est relativement simple, heureusement, il suffit de créer une nouvelle "classe" de points-test qui ne serait active que lors d'un déplacement horizontal. Cyril avait bien proposé le passage à un moteur physique plus complet (avec gestion de la friction, de l'élasticité des chocs et tout -- vous savez comment est Cyril ;) mais je préfère garder ça au niveau du script pour l'instant.

Autre petite modif' en cours: varier les types de blocs possibles. C'est joli, un éditeur de niveau qui vous propose toutes sortes de pentes, de blocs réactifs et ce genre de choses, mais si le moteur de jeu voit juste "ciel" et "roc", on est pas avancé. Enfin, ça, ça peut prendre encore un moment.

2 commentaires:

thoduv a dit…

Je serai intéressé par savoir comment tu as géré ça. Moi en général, je fais la vérification des collisions séparement pour X et Y, du genre:

si collision(x + deplacement_x, y): deplacement_x = 0
si collision(x, y + deplacement_y): deplacement_y = 0

Mais évidemment, ca fait deux calculs de collision, et c'est pas très léger comme méthode... Si tu as une autre façon de faire, je suis preneur ! :)

sylvainulg a dit…

Pour l'instant, j'annule complètement le déplacement dès qu'il y a collision sur un des points. En introduisant des testpoints "horizontaux", je pourrais aussi interrompre uniquement déplacement_x.

Pour le côté "pas très léger", tout dépend de ce qu'un calcul de collision implique. Pour moi, c'est juste un test dans la map sur base des attributs du tile, et je dois de toutes façon le faire sur chacun des points (généralement, un point intervient pour le déplacement x ou le déplacement y, rarement les deux ;)