Ma première tentative de détection de collision avec le sol utilisait une méthode de vérification pixel par pixel. Donc, lorsqu’un élément de dessin de mon héros se superposait à un élément du dessin du sol, il y avait détection de collision et j’empêchais ainsi le joueur de passer au travers du plancher.
Génial!
De cette façon je pouvais dessiner l’arrière plan de n’importe quelle façon et mon personnage réagirait toujours de la bonne manière!
Je me suis rapidement rendu compte, malheureusement, qu’il y avait deux inconvénients majeurs à cette solution. Tout d’abord, vérifier toutes les pixels à chaque cycle du jeu (donc 60 fois par secondes!), ça coûte cher en capacité de calcul. En fait, vérifier l’intégrité de mon personnage à chaque cycle gelait carrément mon pc. Même en réduisant l’espace de vérification, le processus ralentissait de façon notable. Mes premiers tests, fait avec une petite image (une balle, 8 X 8) ne causait pas de problème, mais là, ça ne fonctionnait plus.
De plus, un pixel, c’est petit.
Je me trouvais dans des situations où mon personnage se tenait par le bout des orteils sur des corniches escarpées sans sourciller (à la Super Mario Bros).
J’ai donc dû jeter aux rebuts 1 mois de code et me lancer dans une nouvelle direction.
Le nouvel engin de détection, celui qui est toujours en vigueur en ce moment, est beaucoup plus léger, mais demande du data provenant du niveau. Chaque niveau doit contenir une suite de coordonnées qui forme une ligne brisée, une sorte de rail, sur lequel le héros à la permission de se mouvoir. Il peut être plus haut que cette ligne (sauter, tomber d’une falaise, grimper, etc.), mais il ne peut jamais être plus bas.
Pour ceux qui me connaisse, j’avoue avoir travaillé fort pour retrouver les mathématiques nécessaires à cette implémentation (la pente, l’intersection de l’axe des ordonnées)!
Outre le fait de devoir fournir un liste de coordonnées à l’engin pour chaque niveau, cette solution semble tenir la route pour le moment.
Prochaine fois, on parle de spreadsheets et d’animation 2D!!