, un développeur MD britannique qui bosse sur un remake de Shinobi GG et un "demake" impressionnant de Dracula X PS1 pour la Mega Drive.
Entre deux présentations de ses démos techniques, il passe beaucoup de temps à poster de nombreux tutoriaux sur divers aspects du développement rétro. Les tests de collision avec le décor constituent l'une des demandes les plus récurrentes dans ce domaine — et je comprends pourquoi, parce que ce type de compétence relève aujourd'hui littéralement de l'abandonware. Très peu de gens qui comprennent les méthodes de l'époque partagent ces infos, surtout que des outils de développement "clés en main" permettent de s'en affranchir, ce qui est carrément dommage. Quand tu comprends finalement le concept, tu te dis effectivement que ça doit être de la connaissance triviale ; mais quand tu es novice, le concept même t'échappe.
Il existe plusieurs méthodes de collision, mais l'une des plus "simples" et populaires est celle du tableau (array). Cela consiste essentiellement à représenter de manière simplifiée les tuiles (16x16 pixels) de ton écran sous forme de 0 et de 1. Les tuiles 0 sont "libres" (on peut marcher dessus) et les tuiles 1 sont solides (ton sprite ne se déplacera pas).
Code : Tout sélectionner
const unsigned char HOUSE_COLLISION_ARRAY[256] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
Pour savoir sur quelle tuile ton sprite va se retrouver, il faut quelques petites étapes assez simples :
1. Convertir ta position pixels en position tuiles (généralement via une division par 16).
2. Une formule pour calculer le
de la tuile sur laquelle va se déplacer ton sprite lors du prochain mouvement de pad.
3. Interroger ton tableau de collision pour savoir si la tuile en question est libre (valeur 0) ou solide (valeur 1).
4. Du code pour "repousser" (pushback) ton sprite à sa position précédente en X et/ou Y si cette tuile est solide.
On peut étendre ce système très versatile à des tuiles de type différent, au hasard valeur 2 pour définir une tuile qu'on pourrait traverser dans un sens mais pas dans un autre (un tapis roulant par exemple). Une fois que tu as capté le fonctionnement général, ça coule de source. Mais c'est un peu comme les cathédrales : personne n'a transmis de méthode de construction... parce qu'à l'époque tout le monde savait apparemment comment les construire !