Création de jeux

Création de jeux > Articles sur la création > L'affichage des jeux 2D

Article sur la création

L'affichage des jeux 2D

Dans beaucoup de langages de haut niveau (je pense notamment aux langages « tout-en-un » comme Blitz, Pure Basic, Dark Basic, tc...) et dans les principales bibliothèques vouées à l'affichage on manipule facilement des sprites, sans trop savoir comment cela fonctionne en interne. On note parfois l'existence de sprites 3D, même dans un projet dont l'affichage est exclusivement en deux dimensions. Nous allons nous intéresser à la composition d'une scene 2D dans un jeu. Cet article ne présente que l'aspect théorique, et est très fortement simplifié : il s'adresse avant tout aux débutants et aux curieux. Toutes les figures qui illustrent cet article proviennent des articles du Gritche sur Prografix.

Les surfaces

Les surfaces (ou buffers) sont des blocs de mémoires qui contiennent une image. Ces surfaces sont soit stockées dans la mémoire de la carte vidéo (on parle de surfaces hardware), soit dans la mémoire vive de l'ordinateur (on parle de surfaces software). L'une de ces surfaces (qui elle est toujours hardware) s'appelle la surface primaire. Cette dernière contient ce qui est affiché à l'écran. Toute modification de cette surface modifiera donc ce qui est affiché par le moniteur. Les autres surfaces servent principalement à stocker les images que l'on compte afficher à l'écran. Ce sont les surfaces offscreen (littéralement, hors de l'écran). Ces images, ce sont les sprites. Elles ne sont pas directement affichées à l'écran, elles sont invisibles. Pour afficher un sprite à l'écran, il suffit de copier le contenu de la surface offscreen dans la surface primaire. Usuellement, on dit qu'on « blit » une surface dans une autre. Le principe est simple. On peut ainsi composer de superbes scenes en deux dimensions.

Schema montrant le principe du blitting
Figure 1: Une scène composée via différents blits

Certaines parties des surfaces offscreen sont considérées comme transparentes à la guise du programmeur: elles ne sont pas copiées lors d'un blit. Ceci permet d'afficher un sprite par dessus un décor, sans afficher le fond de la surface.

Schema illustrant le principe de la transparance
Figure 2 : Le principe de la transparance

Notez qu'un blit est normalement plus rapide avec des surfaces hardware qu'avec des surfaces software au moment de l'affichage.

Voir un exemple

Le « double-buffering »

On a vu que pour afficher un sprite à l'écran, il suffisait de blitter une surface offscreen dans la surface primaire. En réalité, il est déconseillé de proceder ainsi, cela produirai un effet disgracieux à l'écran. Pour le comprendre, imaginez une scene constituée de plusieurs sprites.. En agissant directement sur la surface primaire, les sprites apparaîtraient un à un. Ce qu'il faut, c'est calculer une scene complete avant de l'afficher. Pour cela, on va constituer notre scene avec différents blittings dans une surface offscreen de la même taille que la surface primaire. On appelle cette surface le « back-buffer ». Quand on a terminé la scene, il suffit de remplacer la surface primaire par ce back-buffer. On parle d'un « flip ». La surface primaire devient le back-buffer, et le back-buffer devient la surface primaire. Ceci permet d'afficher tous les sprites d'un seul coup, astucieux non ? Nécessaire, en tout cas.


Figure 3 : Le principe du double buffering

Voir le résultat

Le billboarding

Cette technique est arrivée avec l'avènement de la 3D. En 3D, on dispose d'objets, comme les cubes, sur lesquels on peut appliquer des textures. Ces textures sont des images qui donnent une apparence à l'objet 3D. Lors du rendu, les textures sont toutes déformées par la carte 3D pour pouvoir être affichées dans un décor 3D. (par exemple, en fonction de notre placement, un mur texturé n'aura pas la même forme en deux dimensions que si l'on se déplace.) Les calculs qui permettent ces transformations sont assez compliqués. Les cartes 3D sont développées pour faire ces calculs rapidement, et ainsi décharger le processeur de calculs supplémentaires (il a autre chose à faire). Cependant, ces calculs n'interviennent que sur les textures dans le cadre d'un rendu 3D, et se moque des surfaces. Comment s'amuser à faire tourner une sprite sur lui-même, a faire des zooms ou d'autres transformations, avec les surfaces tout en gardant de bonnes performances?

L'astuce, c'est d'utiliser le rendu 3D pour faire de la « fausse » 2D. Prenez un cube, plaquez-lui une texture et orientez-le vers la caméra: ce cube aura tout l'air d'un sprite. Pourtant c'est un cube avec une texture. Cette pratique est appelée le « billboarding ». Elle est très appréciée sur les cartes graphiques modernes et permet toutes les fantaisies. Ces « faux » sprites sont souvent appelés « sprites 3D ».

Conclusion

Vous savez désormais comment on génère une scene à l'écran dans un jeu 2D. Avec une bonne bibliothèque, Blitting ou autre billboarding se font de façon transparente. Sachez que le billboarding tend de plus en plus à remplacer l'utilisation des surfaces, car ses performances sont meilleures : les dernières cartes graphiques sont développés dans ce sens. Néanmoins, les surfaces restent très appréciées par les débutants en raison de leur facilité, et leurs performances restent honorables pour un petit jeu.

Références

© Ludovic Cheng & Guillaume Delhumeau - IMA 2 - 2006