Orwell a écrit :
Un très beau pavé en effet,
Merci

!
mais en tant qu'informaticien j'ai une autre conclusion pour cette méthode 
Héhé, vive la complémentarité

!
En fait je ne vois pas trop l'utilité de passer à des matrices 32*32 étant donné que ce qui nous intéresse à présent, ce n'est plus la surface physique mais bien la surface virtuelle: il suffit donc de considérer l'ancienne surface physique comme étant la virtuelle, et de décaler la position de cette surface par rapport aux positions réelles des obstacles dans la map! Un sol plat pourrait être représenté exactement de la même maniere, sauf que les obstacles se trouveront en pratique non plus au niveau du sol, mais 8 pixels au dessus
Tout ce qu'il y a à faire, c'est "dilater" les obstacles pour symboliser les zones à l'intérieur desquelles le centre de gravité ne peut pas pénétrer, au lieu de représenter les zones inacessibles pour le rectangle du sprite.
Je vois que tu as parfaitement compris ce que je tentais d'expliquer

.
La 'dilatation' dont tu parles correspond à la bordure de 8 éléments ajoutés tout autour de la matrice 16x16 du tile graphique.
Mais il est vrai que cette 'barrière de protection' (le 'volume' entre la surface physique et la surface virtuelle) n'a pas besoin d'être présente tout autour du tile graphique, seulement dans la zone où elle est nécessaire (au-dessus pour un sol, au-dessous pour un plafond, à gauche ou à droite pour un mur).
Ta solution consiste à décaler la sélection 16x16 pour inclure le morceau utile de ma bordure.
Par contre, s'il y a autre chose que des surfaces horizontales ou verticales, ta méthode nécessite quelques adaptations ...
Je vais tenter de représenter graphiquement ce que j'avais en tête en parlant du
tile 16x16 d'un morceau de terrain à 45° (dont je n'ai même pas utilisé les propriétés dans la suite de mon post ...), mais là en 8x8 pour raisons de place (donc une barrière d'épaisseur 4 px).
L'angle de 45° n'apparaît pas bien, mais là, ce n'est pas ma faute

,,
!Tile de départ | Surface virtuelle | Avec bordure
| |
| | ,,,,,,,,,,,,,,,,
| O | ,,,,,,,,O,,,,,,,
| O | ,,,,,,,O,,,,,,,,
| O | ,,,,,,O,,,,,,,,,
.......X | .O.....X | ,,,,.O.....X,,,,
......XX | O.....XX | ,,,,O.....XX,,,,
.....XXX | O.....XXX | ,,,O.....XXX,,,,
....XXXX | O ....XXXX | ,,O,....XXXX,,,,
...XXXXX | O ...XXXXX | ,O,,...XXXXX,,,,
..XXXXXX | ..XXXXXX | ,,,,..XXXXXX,,,,
.XXXXXXX | .XXXXXXX | ,,,,.XXXXXXX,,,,
XXXXXXXX | XXXXXXXX | ,,,,XXXXXXXX,,,,
| | ,,,,,,,,,,,,,,,,
| | ,,,,,,,,,,,,,,,,
| | ,,,,,,,,,,,,,,,,
| | ,,,,,,,,,,,,,,
Dans ce cas, le tile graphique ne change pas, et donc, quand on les juxtapose, il y a recouvrement des bordures.
Maintenant, voici graphiquement ta solution (à savoir :
il suffit donc de considérer l'ancienne surface physique comme étant la virtuelle, et de décaler la position de cette surface par rapport aux positions réelles des obstacles dans la map! | OXXXXXXX | °.....XX
XXXXXXXX | XXXXXXXX | .....XXX
XXXXXXXX | XXXXXXXX | ....XXXX
), mais optimisée (tile 8x8, -4 px de bordure => reste le carré 4x4 inférieur droit, dans lequel on met le maximum de matière).Tile de départ | S phys -> S virt | Décalage
| |
.....XXX | .....OXX | .....°..
....XXXX | ....OXXX | ....O...
...XXXXX | ...OXXXX | ...O....
..XXXXXX | ..OXXXXX | ..O.....
.XXXXXXX | .OXXXXXX | .O.....X
XXXXXXXX
Les ° correspondent à des points de la surface virtuelle dont le point correspondant sur la surface physique n'apparaît plus sur le tile, et qui doivent donc être effacés.
XXX
°.....XXXXXXXXXX
.....XXXXXXXXXXX
....XXXXXXXXXXXX
<tile 1><tile 2>
Et si on colle à droite un tile de sol plat de 4 pixels de haut, ça donne :<tile 1><tile 2>
.....°..OOOOOOOO
....O...........
...O............
..O.............
.O.....XXXXXX
Problème : il manque l'arrondi ...
tile 1><tile 2>
.....OOOOOOOOOOO
....O...........
...O............
..O.............
.O.....XXXXXXXXX
O.....XXXXXXXXXX
O....XXXXXXXXXXX
O...XXXXXXXXXXXX
<tile 1><tile 2>
Sachant que le tile de droite aura au maximum 4 pixels de terre (sans quoi la surface virtuelle est hors zone), on peut directement remplacer les ° par l'arrondi, ce qui donne :<Par contre, si on veut faire une longue pente à 45° ... le tile à 45° utilisé ne marche pas.
Ou alors, il faut utiliser des tiles qui n'acceptent que certains autres tiles autour d'eux, afin d'assurer la continuité de la surface virtuelle.
Cette continuité est super importante, puisqu'il suffit d'un seul petit trou d'un pixel dans la surface pour que Sonic passe à traves et plonge dans les ténèbres (Murphy veille !).
En fait, il faut vraiment faire les tiles au cas par cas ...
Ceci peut se faire facilement par l'éditeur de maps au moment de sa création, et demande juste un effort d'implémentation dans la conception de l'éditeur...
Le seul probleme que je vois actuellement, c'est que ceci est parfait pour ramener un disque à un point, or nous avons ici affaire à des rectangles... Mais rien n'empeche d'utiliser cette méthode pour se ramener à des rectangles plus petits pour diminuer le nbre de points à traiter 
Si tu vois comment faire, tant mieux

!
Au fait, je viens d'y penser : tu parlais de looping.
Et un looping, ça impose au moins deux plans, et le passage de Sonic d'un plan à l'autre.
En effet, quand il commence le looping, il passe devant la fin du looping qui n'est pas un obstacle (mais le début sur lequel il est en est un), et quand il termine le looping, il passe devant le début du looping qui n'est plus un obstacle.
As-tu pensé à gérer ceci ?
@++