3Fermer5
BrunniLe 16/08/2004 à 16:38
Je ne sais pas comment tu gères tes pentes, mais je peux te dire que Sonic, c'est plutôt une mauvaise idée pour débuter. :]
Pour tes plate-formes, tu peux utiliser des tableaux, définissant l'offset en Y correspondant à l'offset X de ta plate-forme (tableau(x)=offset_y) de la collision sur le pixel en cours. Par exemple pour une plate-forme inclinée à 26.5651° vers le bas:
{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7};
En fait, en traçant cette fonction, tu verras apparaître ta pente. Ainsi, avec un position_x modulo 16 (car dans mon exemple chaque tile fait 16 pixels) tu peux déterminer sur lequel pixel de la tile à tester les pieds de ton personnage se trouvent. Et si la position des pieds à cet endroit (modulo 16, forcément) est supérieure à celle qui est définie dans le tableau, alors Sonic se trouve sur la plate-forme. Maintenant tu me diras probablement qu'il se trouve sur plusieurs tiles en même temps; oui mais chaque chose en son temps. Tu devras bien sûr faire plusieurs tests et ce à intervalles de 16 pixels. Par exemple, si ton personnage fait 39 pixels, tu testeras à:
x+0, x+16, x+32, x+39
Comme ça tu es sûr de ne manquer aucune tile.
Note: Pour Sonic, je te conseille vivement de ne le faire bouger que d'un pixel par passe, sinon ce sera très dur d'implémenter un moteur de collisions qui soit stable. Prenons le cas où tu veux le faire avancer de 8 pixels, alors tu le feras avancer 8 fois d'un pixel, et ne pas oublier de lancer à chaque fois le moteur de collisions entre deux sick.
Ensuite, lorsque tu as trouvé la plate-forme avec laquelle il y a une collision (eh oui une à la fois!), tu pourras y faire "coller" Sonic; tu connais la valeur de l'offset y (grâce au tableau[position_x%16]), comme les tiles sont toujours à des positions multiples de 16, tu peux connaître la position "idéale" où devraient se trouver ses pieds, qui est offset_y+position_tile*16. Maintenant que c'est fait, Sonic prend l'angle qui est associé à cette plate-forme.
N'oublie pas que Sonic est très dépendant de tout ça. On pourrait imaginer un Mario sans même gérer des angles (c'était le cas jusqu'à Yoshi's island) mais pour Sonic, il faut vraiment que tu gères ça, sachant par exemple que son centre de gravité est perpendiculaire à son angle. Sinon tu ne pourrais pas le faire monter contre les murs (ou qu'à condition de bidouilles extrêmes).
Vu d'un autre angle, c'est très simple, imagine que Sonic monte sur un mur de 90°, alors il n'est plus vraiment attiré vers le bas, mais plutôt vers la droite (l'endroit où se trouve ses pieds). La force de gravité reste présente, mais elle est trop petite (de l'ordre de 2) comparée à la vitesse de Sonic s'il va vite (de l'ordre de 8 à 16) et il pourra donc monter sur ces murs du moment qu'il va assez vite. La force de gravité ne contribue donc qu'à ralentir sa vitesse v / 90° (dans ce cas-là c'est un vecteur).
Mais bon, toutes ces lois physiques, c'est bien joli, mais ce n'est pas applicable dans un véritable de moteur de Sonic, et ce particulièrement si tu prévois de l'implémenter sur TI (demande trop de puissance). Il faut donc éliminer et simplifier le plus possible sans pour autant tomber dans la bidouille.
Ah et une dernière chose à propos des tableaux de collisions, dans mon moteur, je ne gère en fait les collisions qu'en haut et en bas de Sonic. A gauche et à droite, seuls les murs (type dur) sont gérés, c'est pourquoi les tables de collisions ne représentent que y=f(x).