Travaux sur Machine de aci
3. Une police d’un caractère sous X-window

Cette séance poursuit l’implémentation du jeu xhextris examiné en Travaux Dirigés.



1 Initialisation de polices sous X11

Pour obtenir le chargement d’une police de caractères en X-window, on utilise la fonction XLoadQueryFont(Display *d, char *n). Elle retourne un pointeur sur une structure de type XFontStruct décrivant la police de nom n si elle est disponible. Si ce n’est pas le cas, la fonction retourne NULL, et il faut alors chercher dans d’autres répertoires si la police s’y trouve. Pour cela, on dispose de deux fonctions :

Écrire une fonction xhextrisFont, prenant en argument un nom de police de caractères, un répertoire, et deux couleurs de pixel. Si la police est inconnue et dans les répertoires par défaut, et dans le répertoire indiqué en argument, la fonction sort en erreur. Sinon, elle déclare un contexte graphique à l’aide de la fonction XCreateGC, en précisant sa fonte, et ses couleurs de tracé et de fond indiquées par les deux derniers arguments de la fonction à écrire.

La structure XFontStruct retournée par XLoadQueryFont sera affectée à la variable globale textfont pour utilisation ultérieure.


Obtenir un formulaire de soumission de comptes rendus

2 Un caractère est un dessin, et réciproquement

Une particularité de l’implémentation de ce jeu est que ces hexagones ne sont pas dessinés pas XDrawLine et ses variantes, mais à l’aide d’une police de 2 caractères (deux hexagines presqu’identiques définis plus bas), ce qui est effectivement plus efficace car cela minimise les appels au serveur.

Avant de lancer le jeu, il faut donc charger cette police de caractère, ainsi qu’une police iso-latin-1 affichant la documentation du jeu.

Le tracé de ces hexagones se fera dans des couleurs elles aussi préalablement chargées.

Définir la fonction xhextrisColor qui

Comme deuxième argument de XAllocNamedColor prendre DefaultColormap(dpy, DefaultScreen(dpy)), et comme troisième donner le nom de la couleur désirée. Les deux derniers arguments seront pris identiques ici, l’éventuelle différence entre la couleur demandée et celle effectivement allouée ne nous intéressant pas.


Obtenir un formulaire de soumission de comptes rendus

3 Afficher un caractère Xhextris

La police HEXFONTNAME est définie par le fichier textuel hex20.bdf, chaque caractère étant une grille rectangulaire de points définis par des nombres en hexadécimal. Cette grille (bounding box) est déclarée de taille 20 sur 20, un caractère y est donc décrit par 20 lignes de 5 chiffres hexadécimaux (et un sixième à 0 pour cadrage). Le caractère | définit un hexagone d’une certaine taille. Le caractère est identique, avec un bit à 1 de plus à droite et un autre à gauche, plus une ligne de 1 au début et à la fin de la définition. Au total ce caractère a donc un pourtour plus épais de 1 pixel que le précédent.

La fonction xhextrisHex est appelée à de nombreuses reprises pour dessiner un hexagone. Dans certains cas (NOPIECE), il s’agit d’effacer un hexagone coloré se trouvant là à l’étape précédente du jeu. Dans les autres cas, il s’agit de dessiner un hexagone avec sa couleur spécifique et son liseré l’isolant des hexagones adjacents. Ecrire la fonction xhextrisHex prenant en argument des coordonnées x,y et un numéro de couleur, et réalisant le tracé idoine.

Rédiger ensuite la fonction xhextrisCurtain, invoquée à chaque nouvelle partie (commande n de do_choice) : elle utilise la couleur de numéro BORDERPIECE pour afficher la première colonne d’hexagones de bas en haut, puis la suivante de haut en bas et ainsi de suite, en attendant 5 millièmes de secondes entre chaque hexagone. Elle attend 1 seconde et recommence en sens inverse en utilisant la couleur de numéro NOPIECE (c’est le gris). On pourra s’inspirer de la fonction redraw_grid, et utiliser XFlush pour forcer la Xlib à transmettre la requête d’affichage entre deux appels à usleep.


Obtenir un formulaire de soumission de comptes rendus

4 Fermer Xhextris

Définir la fonction Hend qui termine le programme en libérant les contextes effectivement alloués (fonction XFreeGC) et en détruisant la fenêtre principale (fonc XDestroyWindow) et son pixmap (fonction XFreePixmap).


Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 21 janvier 2021 à 19h01min