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