mercredi 11 septembre 2019

Chapitre 63 : jeu graphique dans une fenêtre X11


Dans les chapitres 30 à 36 j’avais commencé à voir les possibilités graphiques d’une fenêtre X11. Dans ce chapitre, je vais présenter le développement d’un petit jeu graphique pour voir les contraintes de ce type de graphisme.
J’ai repris un programme écrit en Basic dans le magazine Jeu et Stratégies de juin 1987 !! qui propose de nous déplacer dans un labyrinthe de 10 niveaux. Il faut réussir à gagner la case de coordonnées 10,10 au niveau 0. Les déplacements sont gérés par les seules touches a pour avancer, k pour aller à gauche et l pour aller à droite. Quand on cogne contre un mur, il est possible d’afficher la carte, de monter ou de descendre d’un niveau, d’augmenter ou de diminuer le nombre de murs d’un niveau mais tout cela de manière presque aléatoire. Attention, il n’est pas vérifié qu’une solution existe et vous pouvez vous retrouver coincé à un niveau !!! 
voir le programme source.
Pour la programmation, nous repartons des programmes proposés pour l’ouverture du serveur X, la création de la fenêtre, des contextes graphiques nécessaires et de la gestion des évènements.
Pour le jeu, j’ai repris la logique des instructions du basic avec quelques adaptations. Pour la création du terrain, j’ai crée une table de 10 graines pour créer le même terrain à chaque niveau. Ainsi quand on monte d’un niveau et quand on redescend, on retrouve le même terrain.
Le programme est très long, car la partie graphique nécessite beaucoup d’instructions pour dessiner les murs du labyrinthe en 3D (et ceci de manière simplifiée). Mais la programmation reste compréhensible grâce aux nombreux commentaires. Il peut rester des erreurs et des aberrations dans cette programmation !!!.
En effet, j’ai pu tester différents cas d’utilisation, de sauvegarde et de restauration des registres suivant les routines.
Pour éviter le chargement fréquent de l’adresse du display, de l’identification de la fenêtre et du contexte graphique, j’ai utilisé les registres r10,r9 et r8 dans toutes les sous routines ce qui n’est pas très conventionnel.
Lorsque la taille du programme augmente, et avec l’utilisation des instructions de la forme ldr r0,=toto, la compilation signale l’erreur « constante littéral invalide: le bassin doit être plus près ». Donc dans ce programme toutes ces instructions ont été remplacées par ldr r0,iAdrtoto avec la déclaration iAdrtoto .int toto
Mais il est possible de retomber sur l’erreur de compilation suivante :
Erreur: valeur immédiate erronée pour l'offset (4180)
Dans le cas où la déclaration se trouve très loin de l’instruction ldr (à plus de 4096 octets soit environ plus de 1000 lignes d’instructions). Pour résoudre cette anomalie il faut modifier l’instruction ldr en ldr r0,iAdrtoto1 et ajouter au plus près la déclaration iAdrtoto1  .int toto