Ce post n'est pas une question c'est une réponse Ca pourrait être transformé en tutoriel si quelqu'un a le temps mais pas moi...
Je sais que beaucoup de débutants galèrent avec cette technique d'affichage basique des jeux 2d, trop de mauvais tutoriels avec des calculs non-binaires, des dimensions non-standard, et un drawcall de quad par tile qui met les processeurs à genoux pour rien.
Voilà une explication simplifiée très schématique, vous pourrez demander aux spécialistes du retro-gaming Vetea et Kannagi de vous expliquer plus en détails.
A/ Bases mathématiques
Tout est basé sur les calculs binaires (notemment le bitmask), donc les tiles, les tilesheets et les tilemaps sont intégralement à base de dimensions puissance 2 (8, 16, 32, etc...). Ainsi sur la nes les tilesheets avaient une largeur de 182 pixels, et une hauteur qui variait de 128 à 256. (l'adressage était dynamique afin de pouvoir animer les tilesheets en interne). Les tiles faisaient 8*8 pixels. La tilemap 32*32 tiles.
La logique du tilemapping est entièrement basé sur les ascii sheets. C'est pourquoi un tilesheet de base fait 256 tiles (avec quelques caractères incorporés histoire d'afficher un peu de texte). Le premier jeu en tilemapping (Tetris) était entièrement affiché avec des caractères ascii. Vous pourrez ensuite doubler ou quadrupler les sheets mais il faut d'abord s'entraîner avec un seul.
B/ Algorithme
On appelle ça le "mirrored scrolling". Pour chaque plan, la tilemap est légèrement plus grande que l'écran et affichée en 4 exemplaires afin de pouvoir faire un scrolling répété. Au fur et à mesure qu'on scrolle, les tiles sont mises à jour sur les bords de l'écran. Même principe quand vous passerez à des mappings plus complexes avec des images rectangulaires, des maps géantes en quadtree, etc...
Pour les jeux modernes (ex: les derniers mario 2d) les tilemaps peuvent également être contenues dans des objets indépendants (bloc de briques qui tourne, etc)
C/ Rendu
Méthodes hardware
Le principe est le suivant: les tilemaps sont des renderTargets, où les tiles sont rendues à échelle 1 sans filtering. Le stretching se fera ensuite en fonction de la résolution écran (et des effets de zoom quand vous ferez de la 2d moderne).
1/ Méthode débutants.
La tilemap est mise à jour avec des petits drawcalls de quads qui permettent de copier-coller les tiles depuis le sheet. Les moteurs 2d de pygame, SDL et html5 le font automatiquement. En revanche avec cette méthode vous ne pourrez pas animer les tilesheets, l'arrière plan va rester statique.
Une petite tech-démo maison en js, clic-droit, afficher la source: http://punkcoders.free.fr/platformer/
2/ Méthode pro.
La tilemap est rendue avec un shader de displacementMapping. Attention c'est gourmand en GPU donc prévoir un menu de baisse de résolution résolution pour les smartphones.
Pour animer le tileSheet il doit lui-même être une renderTarget.
Bon.... j'avais fait ça en assembleur pour le vieux flash player mais voilà un tuto webgl qui règle ça en une ligne de GLSL (qui n'est pas de moi):
http://media.tojicode.com/zelda/
Méthodes software
Là vous faites exactement comme les émulateurs de vieille console, votre écran tronque une texture dont vous modifiez la couleur des pixels, en reproduisant les calculs de ces vieilles machines qui raisonnaient scanline par scanline afin de simplifier la logique de rendu en 1d. Le rendu au pixel près doit être optimisé à mort avec un maximum de calculs binaires.
Petites tech-demos maison:
En javascript: http://punkcoders.free.fr/noelshoot/
En c++: http://punkcoders.free.fr/punkowip/
voilà
Vous avez tous les calculs dans les sources JS, bon apprentissage à tous.
Pour la petite histoire, si les machines japonaises font ça beaucoup plus rapidement que nos machines chinoises, c'est parce que chez les japonais les calculs de tile-mapping sont directement programmés en assembleur embarqué dans les puces des bornes/consoles/cartouches.
Partager