Comprendre les routines graphiques de base


Vous etes maintenant prêt à afficher quelquechose à l'écran. Même si vous plannifiés d'utiliser pleins de sprites pour votre jeu, vous trouverez bientôt les routines graphiquesrès efficace
et très utile rien que par le fait qu'elles n'utilisent que très peu de ressource mémoire.


Dans ce document 3 fonctions vont vous etes présentées :

GsLINE ( lignes )
GsGLINE ( lignes avec options avancées )
GsBOXF ( rectangle plein )

Tout d'abord rappelons que pour afficher à l'écran nous avons besoin d'une table d'ordennancement ( T.O.). Aussi on peut assimiler une T.O. à une donnée contenant toutes les routines
graphiques que l'on veut utiliser. A chaque nouvelle image nous insérons dans les T.O. les routines graphiques utilisées. Puis quand les 2 buffers permtutent, les routines graphqiues sont
exécutées sur le buffer off-screen pour etre afficher à la prochaine permutation.

GsLINE, GsGLINE, GsSortBoxFill

La création et l'insertion dans les T.O. sont assez simple à implémenter. Déjà nous créons une structure de la forme que l'on veut affciher. Puis on remplit les champs par les valeurs désirées. Ainsi pour une diagonale bleue, nous faisons :

                                                                                          GsLINE aline;
                                                                                          aline.attribute = 0;
                                                                                          aline.x0 = aline.y0 = 50;
                                                                                          aline.x1 = aline.y1 = 100;
                                                                                          aline.r = aline. g = 0; aline.b = 255;

Les fonctions pour insérer les routines graphiques primaires dans les T.O. commencent tous par le préfix GsSort....Aussi rappelez vous que nos T.O. contiennent un nombre de plans (ou rofondeurs ) dépendant de la longueur de la T.O. (OTLength). Le plan 0 est le plan le plus proche de l'écran, allant jusqu'au plan 2^OTLength-1 qui représente le plan le plus loin de l'écran. Pour insérer dans le plan 0, nous faisons :
                                                                             
                                                                                           GsSortLine(&aline, &ordering_table,0)

Et ca y est! Quand la commande GsDrawOt est appelée, la ligne apparaitra sur l'écran.
Le champ attribut détermine peu de choses mais a quand même son importance :

              - Le choix d'une semi-transparence
              - Le type de la semi-transparence si il y en a une
              - L'affichage ou non de votre forme

(voir le manuel des librairies pour plus de détails )


WorkBase

Afin que les routines graphiques soient exécutées, il faut disposer d'espace mémoire. Cet espace mémoire se nomme "GpuPacketArea" mais peut varier en fonction du choix du pogrammeur dans la variable.

Gpu : signifie Graphics Process Units. C'est le composant qui gère l'exécution des routines graphiques pour vous permettre de voir de jolies choses sur l'écran.
Packet : correspond à l'unité de nos routines graphiques. Une routine graphique peut etre de taille maximum de 24 unités. Pour savoir combien l'unité de votre routine graphique vaut il suffit de faire un sizeof() sur la structure qui a été inséré.
Area : Endroit, place.

Ainsi avant d'insérer une routine graphique dans notre T.O. nous devrons indiquer au GPU ou se trouve l'emplacement mémoire de travail. Nous le faisons grace a cette ligne de commande :

                        GsSetWorkBase((PACKET*)GpuPacketArea[buffer] )

Nous devons en avoir une pour chaque buffer afin d'éviter les conflits.
Nous pouvons alors nous poser la question de Quelle taille devons nous faire nos GpuPacketArea ?

Quequefois vous verrez PACKET gpuPktArea[2][8192].
                                                          ou
                                    PACKET gpuPktArea[2][MAX_OBJ * 24]
.

Bien sur cela depend du nombre de primitives que vous utilisez. Le chiffre exact est le nombre de primitives dans chaque image que vous insérez dans les T.O. * le nombre d'unités (Packets) que chacune requiert. La plupart des programmeurs déclarent juste plus d'espace qu'il ne leur en faut. Si vous déclarez votre taille statiquement ( c.a.d par ex. [8192] ) soyez sur que l espace mémoire alloué soit au moins égale à la taille nécessaire pour générer l'image.

Problèmes

Vous pouvez peut-etre trouver que ces lignes, ces rectangles pleins ne suffisent pas à la réalisation de votre jeu. Cercles, triangles, ect, seraient les bienvenus, mais malheureusement ils nécessitent plus de calcul de la part du CPU. Pour répondre à ce problème, la méthode la plus efficace est d'utiliser les sprites. Bien sur les sprites requierent plus de mémoire mais les routines graphiques ont été optimisées pour leur utilisation.
Autre petit problème si vous mettez [1023] comme taille d'espace mémoire lorsque l'image sera affichée alors votre écran se figera. Cette valeur est donc à éviter.


Le code source illustrant les capacités des routines graphiques primaires de la Yaroze est disponible ici (primaire.zip) . Ce fichier source utilise les fichiers des conttrolleurs que vous pouvez télécharger sur la page controlleur..



                                                                                                                         retour à l'index