L'AFFICHAGES DES TEXTES
LISTE DES MOTS CLÉS SPÉCIFIQUES.
Mots clés du BBC BASIC.
CLS : efface les textes de la fenêtre.
COLOR : voir COLOUR
COLOUR : définit la couleur d'avant-plan et d'arrière-plan de la surface textuelle.
COUNT : retourne le nombre de caractères affichés sur la dernière ligne courante.
GCOL : définit la couleur d'avant-plan et d'arrière-plan de la surface graphique.
GET() : retourne le code ASCII du symbole présent à une position donnée.
GET$() : retourne dans une chaine de caractères le symbole présent à une position donnée.
MOVE : déplace le curseur graphique aux coordonnées indiquées.
INPUT : attend que l'utilisateur entre une ou des valeurs à l'aide du clavier.
MODE : permet de définir la fenêtre d'affichage du programme.
MOVE : déplace le curseur graphique aux coordonnées indiquées.
OFF : masque le curseur textuel.
ON : affiche le curseur textuel.
OSCLI : interprète une chaine de caractères comme une commande de l'OS.
POS : retourne la position horizontale du curseur textuel.
PRINT : affiche une liste d'impression dans la fenêtre de sortie.
TAB() : positionne le curseur graphique.
VDU : configure certains paramètres de la fenêtre de sortie et/ou de ses composants.
VPOS : retourne la position verticale du curseur textuel.
WIDTH : définie le nombre de caractères à afficher avant un saut de ligne.
Variables système du BBC BASIC.
@vdu.c.x% : retourne la position horizontale du curseur textuel, en pixels.
@vdu.c.y% : retourne la position verticale du curseur textuel, en pixels.
@vdu.g.a& : retourne action d'avant-plan graphique, définie par l'instruction GCOL.
@vdu.g.b& : retourne la couleur d'avant-plan pour les dessins, définie par l'instruction GCOL.
@vdu.g.c& : retourne action d'arrière-plan graphique, définie par l'instruction GCOL.
@vdu.g.d& : retourne la couleur d'arrière-plan pour les dessins, définie par l'instruction GCOL.
@vdu.hf% : retourne le handle de la police actuelle, tel que défini par *FONT.
@vdu.t.a& : retourne la ligne supérieure du curseur textuel définie par la commande VDU 23 , 0 ,10.
@vdu.t.b& : retourne la ligne inférieure du curseur textuel définie par la commande VDU 23 , 0 ,11.
@vdu.t.c& : retourne la couleur d'avant-plan textuel définie par l'instruction COLOUR.
@vdu.t.d& : retourne la couleur d'arrière-plan textuel définie par l'instruction COLOUR.
@vdu.tl% : retourne le bord gauche de la surface textuelle défini par la commande VDU 28.
@vdu.tr% : retourne le bord droit de la surface textuelle défini par la commande VDU 28.
@vdu.tt% : retourne le haut de la surface textuelle défini par la commande VDU 28.
@vdu.tb% : retourne le bas de la surface textuelle défini par la commande VDU 28.
@vdu.w.a& : retourne la largeur, en pixels, du curseur textuel définie par la commande VDU 23 , 0 , 18.
@vdu.w.c& : retourne le controle du mouvement du curseur textuel défini par VDU 23 , 16.
@char.x% : retourne la largeur, en pixels, d'un caractère, définie par MODE ou VDU 23 , 22.
@char.y% : retourne la hauteur, en pixels, d'un caractère, définie par MODE ou VDU 23 , 22.
Commande système.
*FONT : charge une police de caractères au standard UTF-8, et force son utilisation par défaut.
Modules de la bibliothèque du BBC BASIC.
fnusing.bbc : propose des fonctions pour convertir des chaines de caractère et formater l'affichage.
mode7lib.bbc : propose des procédures pour utiliser des jeux de caractères alternatifs dans le MODE 7.
pdflib.bbc : propose des procédures et des fonctions permettant de créer des documents au format .pdf.
script.bbc : propose des procédures permettant de prendre en charges certains alphabets non latin.
PRÉAMBULE.
Rappel : quand des coordonnées textuelle sont données dans la surface textuelle, la première valeur correspond à la colonne et la deuxième valeur corresponds à la ligne. L'axe des colonnes est parallèle aux bords haut et bas de la fenêtre de sortie, la valeur de la colonne augmente en allant vers la droite et diminue en allant vers la gauche. L'axe des lignes est parallèle aux bords gauche et droit de la fenêtre de sortie, la valeur de la ligne augmente en allant vers le bas et diminue en allant vers le haut. Le point d'origine est l'intersection de ces deux axes et ses coordonnées sont ( 0 , 0 ).
Par défaut, un caractère occupe une matrice de 8 x 8 points en ASCII. Dans ce cas, une colonne correspond à la largeur d'un caractère et la hauteur d'une ligne à la hauteur d'un caractère. Mais il est possible de modifier le codage et les spécificités des caractères et changeant de standard de la fonte : ASCII, UTF, ...
Rappel : quand on fait appel à une variable système, il est conseillé de faire marquer une légère pause au programme avec la fonction WAIT() afin de s'assurer que les traitements en cours sont bien terminés et que les valeurs de ces variables ont bien été mise à jour.
Par défaut, un programme BBC BASIC se lancera dans une fenêtre par défaut, ne pouvant afficher que du texte et des graphismes noir sur fond blanc. Cette configuration pouvant suffire pour des applications simples, avec peu de mise en forme, elle est insuffisante pour exploiter pleinement les possibilités graphiques qu'offre le BBC BASIC.
Pour modifier les caractéristiques de la fenêtre, où s'exécutera le programme BBC BASIC, on peut utiliser l'instruction VDU 22 , 23 , largeur ; hauteur ; charx , chary , ncols , charset pour une configuration fortement personnalisée mais le plus souvent, on aura recours à l'une des options de l'instruction MODE.
La fenêtre obtenue avec l'instruction MODE 8, est une bonne configuration polyvalente, en s'adaptant aisément à la plupart des ordinateurs, ce qui permettra de déplacer son script sur d'autres machines sans avoir à adapter le code du programme en fonction de la configuration de l’hote. L'option MODE 8 permet d'afficher :
- du texte en 80 colonnes sur 32 lignes ;
- des dessins en 640 pixels de large sur 512 pixels en hauteur (1280 x 1024 unités graphiques) ;
- en 16 couleurs.
Avec BBC BASIC SDL 2.0 une unité graphique corresponds en réalité à deux unités d'image, ou pixels. Par exemple, en MODE 8, la fenêtre de sortie a une surface graphique de 640 x 512 points soit une surface d'image de 1280 x 1024 pixels.
Rappel : bien qu'elles cohabitent, en se chevauchant, dans la fenêtre de sortie, la surface textuelle et la surface graphique sont bien 2 surfaces différentes. A l'initialisation d'une nouvelle fenêtre de sortie, les surfaces textuelle et graphique s'étendent sur la totalité de la fenêtre de sortie du BBC BASIC, mais leur taille et leur position peuvent être modifiées, indépendamment l'une de l'autre, et elle pourront être restaurées à leur valeur initiale avec la commande VDU 26.
L'instruction CLS efface la surface textuelle, alors que l'instruction CLG supprimera le contenu de la surface graphique. Si toute ou partie des surfaces textuelle et graphique sont superposées, la couleur d'arrière-plan de la zone commune sera définie par la dernière commande d'effacement exécutée. Les caractères sont affichés en fonction de la position du curseur texte, par défaut, et les dessins sont tracés en tenant compte du curseur graphique.
MODE 8 : REM - affiche et initialise une fenêtre de sortie
VDU 28 , 30 , 17 , 52 , 8 : REM - modifie la surface textuelle
VDU 24 , 300 ; 250 ; 750 ; 900 ; : REM - modifie la surface graphique
GCOL 129 : CLG : REM - efface et recolorise la surface graphique
COLOUR 132 : CLS : REM - efface et recolorise la surface textuelle
FOR ktest = 0 TO 127
COLOUR ktest
PRINT "BBC BASIC for SDL 2.0"
GCOL RND ( 16 )
LINE RND( 1280 ) , RND( 1024 ) , RND( 1280 ) , RND( 1024 )
WAIT( 25 )
NEXT ktest
END
Pour modifier la position de la surface textuelle dans la fenêtre de sortie, et ses dimensions, sauf si la fenêtre de sortie est en MODE 7, on utilisera la commande VDU 28 , gauche , bas , droite , haut où :
- gauche indique le rang la première colonne depuis la gauche de la fenêtre de sortie ;
- bas indique le rang la dernière ligne depuis le haut de la fenêtre de sortie ;
- droite indique le rang la dernière colonne depuis la gauche de la fenêtre de sortie ;
- haut indique le rang la première ligne depuis le haut de la fenêtre de sortie.
gauche, bas, droite et haut étant exprimés en fonction du coin supérieur gauche de la fenêtre de sortie, la position du :
- premier caractère de la surface textuelle se trouvera donc à ( gauche , haut ) de la fenêtre de sortie ;
- dernier caractère de la surface textuelle se trouvera donc à ( droite , bas ) de la fenêtre de sortie.
Après modification de la surface textuelle, si le curseur texte se trouve :
- à l'extérieur de la nouvelle surface, il est déplacé en ( 0 , 0 ) ;
- à l'intérieur de la nouvelle surface, il n'est pas déplacé, mais ses coordonnées sont mises à jour.
MODE 8
kencre = 6
kfond = 128
REPEAT
VDU 28 , RND( 35 ) , 17 + RND( 14 ) , 44 + RND( 35 ) , RND( 12 )
IF kencre < 16 THEN kencre += 1 ELSE kencre = 0
IF kfond < 143 THEN kfond += 1 ELSE kfond = 128
CLS
COLOUR kencre
COLOUR kfond
WAIT ( 25 )
PRINT TAB( 5 , 3 ) "Appuyez sur Q pour quitter."
kpause$ = INKEY$( 25 )
UNTIL kpause$ = "Q" OR kpause$ = "q"
END
On remarquera :
- seuls les caractères contenus dans la nouvelle surface de la surface textuelle sont effacés ;
- avant l'instruction CLS, la couleur de fond des caractères est prise en compte ;
- après l'instruction CLS, seule la nouvelle surface de la surface textuelle est recoloriée ;
- si la chaine de caractères est plus longue que la surface graphique, il y a un retour à la ligne automatique.
Voir l'instruction MODE pour plus de détails sur les options disponibles pour la fenêtre d'affichage.
Voir l'instruction VDU pour plus de détails sur les options de flux de sortie sélectionné.
LES CARACTÈRES.
Rappel : avec BBC BASIC SDL 2.0 une unité graphique corresponds en réalité à deux unités d'image, ou pixels. Par exemple, en MODE 8, la fenêtre de sortie a une surface graphique de 640 x 512 points soit une surface d'image de 1280 x 1024 pixels.
Les caractères sont affichés dans une matrice, dont les dimensions, en points graphiques, sont fonction du MODE choisi. Pour connaitre la largeur d'un caractère, on divisera le nombre de colonnes par le nombre de points graphiques de la largeur de la fenêtre de sortie et pour connaitre la hauteur d'un caractère, on divisera le nombre de lignes par le nombre de points graphiques en hauteur de la fenêtre de sortie. Pour obtenir ces dimensions en pixels, on multipliera les dimensions en points graphiques par 2.
Par exemple, en MODE 8, les dimensions en points graphiques de la fenêtre de sortie sont de 640 x 512 pour 32 lignes de 60 colonnes pour les caractères, ce qui donne :
- largeur des caractères : 640 points graphiques / 80 colonnes = 8 points graphiques soit 16 pixels ;
- hauteur des caractères : 512 points graphiques / 32 colonnes = 16 points graphiques soit 32 pixels.
Mais en MODE 2, les dimensions d'un caractère seront de 32 x 16 points graphiques et en MODE 3, elles seront de 8 x 20 points graphiques. Donc, selon le mode de la fenêtre de sortie, l'apparence d'un caractère peut varier en hauteur et/ou en largeur, et pourra paraitre comme écrasée ou étirée.
Certains paramètres de la commande VDU 23 , 22 , offrent la possibilité de définir ses propres dimensions pour la matrice d'un caractère. Cette commande attend 6 paramètres et doit avoir le format VDU 23 , 22 , largeur ; hauteur ; caract_largeur , caract_hauteur , palette , encodage :
- caract_largeur permet de définir la largeur, en points graphiques, des caractères ;
- caract_hauteur permet de définir la hauteur en points graphiques, des caractères.
Il est vivement conseillé de faire en sorte que largeur soit un multiple de caract_largeur et que hauteur soit un multiple de caract_hauteur afin que le nombre de colonnes et de lignes soient des nombres entiers, permettant des affichages propres. Attention à bien mettre une virgule entre ces deux paramètres et que tous les paramètres soient bien présents.
VDU 23 , 22 , 640 ; 512 ; 8 , 16 , 16 , 0
REPEAT
PRINT "ABC abc 123 +-= ({["
INPUT "Largeur des caracteres " ; klargeur
INPUT "Hauteur des caracteres " ; khauteur
IF klargeur = 0 OR khauteur = 0 THEN EXIT REPEAT
VDU 23 , 22 , 640 ; 512 ; klargeur , khauteur , 16 , 0
UNTIL FALSE
PRINT "Fin du test. Au revoir."
END
Par défaut, à l'ouverture d'une fenêtre de sortie, les caractères sont encodés avec le standard ASCII, mais il est possible de modifier leur type d'encodage avec le dernier paramètre de la commande VDU 23 , 22 , .
VDU 23 , 22 , largeur ; hauteur ; caract_largeur , caract_hauteur , palette , encodage. encodage pourra prendre la valeur :
- 0, pour le standard ASCII, valeur par défaut ;
- 1, pour le code OEM (IBM PC) ;
- 8, pour le standard UTF-8.
A son ouverture, une fenêtre de sortie, affichera les caractères en blanc sur fond noir. Pour inverser ce comportement, on ajoutera 128 à encodage. Ce qui donnera :
- 128, pour le standard ASCII, valeur par défaut ;
- 129, pour le code OEM (IBM PC) ;
- 136, pour le standard UTF-8.
Note : il semblerait que le fait de charger une police ttf ou otf à l'aide de la commande système *FONT, fasse passer automatiquement en encodage UTF-8 (voir ci-dessous).
Note : en mode UTF-8, les caractères de l'encodage UTF-8 peuvent nécessiter 1, 2 ou 3 octets de mémoire selon leur place dans la liste des symboles.
Voir la commande VDU pour plus de détails sur les autres paramètres de la commande VDU 23 , 22 , .
Bien que le standard ASCII soit nettement suffisant pour de petits programmes personnels ou du prototypage, le standard UTF-8 devrait être systématiquement sélectionné pour applications qui doivent être plus largement distribuées. En effet, il s'agit du standard d'encodage des caractères permettant d'obtenir l'intégralité des symboles typologiques recensés, y compris les alphabets grec, cyrillique, arabe, hébreu, ... , tout en restant compatible avec le standard ASCII .
Si on opte pour l'encodage universel UTF-8, il faudra, bien entendu, sélectionner une police de caractères à ce standard, en utilisant la commande système : *FONT, et s'assurer que l'utilisateur disposera de cette fonte en la plaçant dans les fichiers de votre distribution. Ce qui implique que cette police soit libre de droit, en étant par exemple sous GNU GPL, ou que vous ayez ses droits d'exploitation et/ou de diffusion.
La commande système *FONT permet de :
- choisir une police de caractères au format TTF ou OTF, en désignant le chemin absolu du fichier ;
- la taille des caractères en points picas, ou points DTP, soit 1/72 pouce ;
- et de préciser leurs attributs avec :
- B pour en gras ;
- I pour en italique ;
- U pour souligner les caractères ;
- Q pour barrer les caractères.
Notez que les attributs U et Q ne peuvent pas être associés. Les caractères peuvent être soulignés ou barrés.
BBC BASIC for SDL 2.0 propose, dans le répertoire BBCBasic/lib/, les fontes au standard UTF-8 :
- DejaVuSansMono.ttf, DejaVuSans-Oblique.ttf, DejaVuSans.ttf ;
- FreeSerif.ttf, FreeMono.ttf, FreeSans.ttf ;
- Bedstead.otf, Bedstead-ext.otf.
Le fichier contenant la fonte souhaitée devant être obligatoirement donné dans sa forme absolue, c'est-à-dire avec son chemin d'accès complet avec son extension .ttf ou .otf, il est fortement conseillé d'utiliser l'instruction OSCLI, le chemin d'accès étant susceptible d'être variable selon l'OS de la machine hote. Voir l'instruction OSCLI pour plus de détails.
Si la désignation du fichier ne correspond pas exactement à l'emplacement donné à la suite de la star commande *FONT une erreur "No such font" sera retournée et stoppera l’exécution du programme, si aucune gestion de ce type d'erreur n'est prévue.
MODE 8
VDU 23 , 22 , 640 ; 512 ; 8 , 16 , 16 , 8
REPEAT
REPEAT
PRINT "Quelle police : [D]ejaVu, [F]ree, [B]edstead ou [Q] pour quitter ?" : kchoix$ = GET$
CASE kchoix$ OF
WHEN "D" , "d" : kfonte$ = "DejaVuSans.ttf"
WHEN "F" , "f" : kfonte$ = "FreeSans.ttf"
WHEN "B" , "b" : kfonte$ = "Bedstead.otf"
WHEN "Q" , "q" : kfonte$ = "quitter"
OTHERWISE kfonte$ = "none"
ENDCASE
IF kfonte$ <> "none" THEN EXIT REPEAT
PRINT "Choix non valide !"
UNTIL FALSE
IF kfonte$ = "quitter" THEN EXIT REPEAT
kfichier$ = @lib$ + kfonte$
INPUT "Quelle taille (de 4 a 32) " , ktaille
IF ktaille < 4 THEN ktaille = 4
IF ktaille > 32 THEN ktaille = 32
ktaille$ = STR$( ktaille )
PRINT "En gras [O] ou [N]on ?" : kchoix$ = GET$
IF kchoix$ = "O" OR kchoix$ = "o" THEN kattribut$ = "B" ELSE kattribut$ = ""
PRINT "En italique [O] ou [N]on ?" : kchoix$ = GET$
IF kchoix$ = "O" OR kchoix$ = "o" THEN kattribut$ += "I"
IF kattribut$ <> "" THEN kattribut$ = " , " + kattribut$
OSCLI "FONT " + kfichier$ + "," + ktaille$ + kattribut$
PRINT "ABC abc 123 +/= ([{"
UNTIL FALSE
PRINT "Fin du test. Au revoir."
END
Enfin, si le programme a besoin de symboles particuliers, par exemple, des personnages ou des objets pour un jeu, la commande VDU 23 permet de créer ses propres caractères.
Voir la commande VDU 23 pour plus de détails sur la création de caractères personnalisés.
GÉRER LES COULEURS.
Dans BBC BASIC pour SDL 2.0, il existe deux types de couleurs : logiques et physiques.
Le nombre de couleurs disponibles dépend du mode d'affichage choisi, il y a :
- 2 couleurs logiques avec MODE 0, MODE 4 et MODE 32 ;
- 4 couleurs logiques avec MODE 1, MODE 5 et MODE 33 ;
- 8 couleurs logiques avec MODE 7, mais ce mode ne possède pas de palette de couleur ;
- 16 couleurs logiques avec les autres modes de fenêtres de sortie ;
- 128 couleurs logiques avec les modes personnalisées grâce VDU 22 , 23 , ....
L'instruction COLOUR couleur permet de modifier les couleurs d'affichage des textes dans la surface textuelle et l'instruction GCOL couleur dans la surface graphique. couleur est un nombre entier compris entre 0 et 255 indiquant le code de la nouvelle couleur par défaut. Si couleur est :
- inférieur à 128 (de 0 à 127), c'est la couleur d'avant-plan qui est modifiée ;
- supérieur à 127 (de 128 à 255), c'est la couleur d'arrière-plan qui est modifiée.
Si couleur est supérieur au nombre de couleurs de la palette : 2, 4 ou 16 selon le mode de la fenêtre de sortie, la couleur sélectionnée sera calculée comme suit, où max est le nombre de couleurs dans la palette (@vdu.m.b& + 1) :
- couleur MOD max si couleur est inférieur à 128 ;
- 128 + ( couleur MOD max ) si couleur est supérieur à 127.
MODE 2
FOR kcouleur = 0 TO 127
COLOUR kcouleur
COLOUR 255 - kcouleur
PRINT CHR$( 129 ) ;
NEXT kcouleur
END
L'instruction CLS effacera le contenu de surface textuelle, et la zone commune avec la surface graphique, colorisera le fond de la surface textuelle de la couleur d'arrière-plan définie par COLOUR, et replacera le curseur textuel dans le coin supérieur gauche de la surface textuelle.
L'instruction CLG effacera le contenu de la surface graphique, et la zone commune avec la surface textuelle, colorisera le fond de la surface graphique de la couleur d'arrière-plan définie par GCOL, mais ne déplace pas le curseur graphique.
Voir La gestion des couleurs pour plus de détails sur la gestion des couleurs logiques et physiques.
AFFICHER DES CARACTÈRES.
Le moyen le plus simple et le plus pratique pour afficher une chaine de caractères est l'instruction PRINT.
Les possibilités, les plus courantes, de l'instruction PRINT sont résumées ci-dessous pour rappel. Voir l'instruction PRINT pour une description plus détaillée de chacune d'elles.
ktexte$ = "BBC BASIC for SDL 2.0"
knombre = 12345.6789
PRINT "BBC BASIC" : REM - affiche le contenu entre les guillemets tel quel
PRINT 9.3 : REM - affiche un certain nombre d'espace avant le nombre 9.3 tel quel
PRINT ktexte$ : REM - affiche la valeur de la variable ktexte$
PRINT knombre : REM - affiche la valeur de la variable knombre sans espace devant
PRINT ktexte$ ; knombre : REM - affiche les deux valeur sans espace entre elles
PRINT ktexte$ , knombre : REM - affiche les deux valeur avec des espaces entre elles
PRINT "BBC BASIC" ; : REM - affiche BBC BASIC sans faire de retour à la ligne
PRINT "for SDL 2.0" : REM - affiche for SDL 2.0 à la suite de BBC BASIC sans espace entre eux
Bien qu'elle soit prévue pour la saisie de données au clavier, l'instruction INPUT peut aussi, sous certaines conditions, afficher des chaines des caractères. Voir l'instruction INPUT pour plus de détails.
INPUT "Comment vous appelez-vous " , knom$
PRINT "Bonjour " ; knom$ ; "."
retourne, par exemple :
Comment vous appelez-vous ? Origine
Bonjour Origine.
La commande VDU permet aussi d'afficher plusieurs caractères dans la surface textuelle, en indiquant le code des caractères, à afficher et en les séparant par un point-virgule.
VDU 66 ; 66 ; 67 ; 32 ; 66 ; 97 ; 115 ; 105 ; 99 : REM - affiche BBC Basic
Cependant, cette pratique est à décourager dans la mesure où les caractères affichés à l'aide de la commande VDU ne contribuent pas à la valeur retournée par l'instruction COUNT, tout en modifiant la position du curseur textuel et donc les valeurs retournées par les instructions POS et VPOS. Cette possibilité devrait rester réservée à l'envoi de caractères de controle, code de 1 à 31.
AFFICHAGE DANS LA SURFACE GRAPHIQUE.
Contrairement aux graphismes, les textes peuvent être affichés aussi bien dans la surface textuelle que dans la surface graphique, sauf avec MODE 7, qui n'autorise que l'affichage dans la surface textuelle.
La commande VDU 5 permet d'afficher les textes dans la surface graphique. La commande VDU 4, mode par défaut au lancement d'une nouvelle fenêtre de sortie, permet d'afficher de nouveau les textes dans la surface textuelle (voir ci-dessus).
Dans la surface graphique, les couleurs d'avant-plan et d'arrière-plan sont définies par l'instruction GCOL. L'empreinte du caractère est affichée dans la couleur d'avant-plan, et le fond de la matrice transparent, même si une instruction GCOL à modifiée la couleur d'arrière-plan depuis le dernier appel de l'instruction CLG.
MODE 8
VDU 24 , 100 ; 100 ; 1100 ; 900 ; : GCOL 129 : CLG
VDU 28 , 45 , 25 , 75 , 17 : COLOUR 132 : CLS
FOR kcouleur = 0 TO 127
COLOUR kcouleur : COLOUR 127 + RND( 16 )
GCOL RND( 16 ) : GCOL 127 + RND( 16 )
MOVE RND( 1280 ) , RND( 1280 )
VDU 4 : PRINT "BBC BASIC for SDL 2.0"
VDU 5 : PRINT "BBC BASIC for SDL 2.0"
WAIT( 15 )
NEXT kcouleur
END
Voir Les dessin et les graphiques pour plus de détails sur la surface graphique.
AFFICHAGE DANS LA SURFACE TEXTUELLE.
Contrairement aux graphismes, les textes peuvent être affichés aussi bien dans la surface textuelle que dans la surface graphique, sauf avec MODE 7, qui n'autorise que l'affichage dans la surface textuelle.
La commande VDU 4 permet d'afficher les textes dans la surface textuelle. C'est l'option par défaut au lancement d'une nouvelle fenêtre de sortie. La commande VDU 5 permet d'afficher les textes dans la surface graphique (voir ci-dessous).
Dans la surface textuelle, les couleurs d'avant-plan et d'arrière-plan sont définies par l'instruction COLOUR. L'empreinte du caractère est affichée dans la couleur d'avant-plan, et le fond de la matrice est dans la couleur d'arrière-plan, qui peut être différente dans la couleur du fond de la surface textuelle, s'il n'y a pas eu d'appel de l'instruction CLS depuis la dernière modification de la couleur d'arrière-plan par une instruction COLOUR. On dira que le fond des caractères est affiché de façon opaque.
Rappel, l'utilisation de l'instruction CLS repositionne le curseur textuel en ( 0 , 0 ), c'est-à-dire dans le coin supérieur gauche de la surface textuelle.
La surface textuelle est divisée en un certain nombre de :
- colonnes, abscisse du curseur textuel, dans le sens horizontal ;
- lignes, ordonnée du curseur textuel, dans le sens vertical.
Le nombre de colonnes et de lignes dépend du MODE actuelle. Par défaut :
- l'origine ( 0 , 0 ) du curseur textuel est dans le coin supérieur-gauche de la surface textuelle ;
- la valeur de son l'abscisse, colonne, augmente en allant vers la droite de la surface textuelle ;
- la valeur de son ordonnée, lignes, augmente en allant vers le bas de la surface textuelle ;
- le premier caractère de la liste impression est affiché à partir de la position du curseur textuel ;
- la suite de la liste d'impression s'étend vers la droite de surface textuelle ;
- si la liste d'impression atteint la droite de la surface textuelle, elle se poursuit sur la ligne suivante ;
- après fin de l'affichage, le curseur est placé sur la position d'affichage suivante.
MODE 8
VDU 28 , 7 , 12 , 50 , 5 : REM - modifie la surface textuelle
COLOUR 138 : REM - modifie la couleur d'arriere-plan en vert
CLS : REM - efface la surface textuelle et la remplie de la couleur d'arrière-plan
COLOUR 142 : REM - modifie la couleur d'arriere plan en cyan
COLOUR 12 : REM - modifie la couleur d'avant plan en bleu
PRINT CHR$( 149 ) ; CHR$( 143 ) : REM -affiche les caractères en bleu sur cyan
PRINT CHR$( 141 ) ;
PRINT " ici l'origine de la surface textuelle."
END
Dans la surface textuelle, l'affichage d'une liste d'impression débute à la position du curseur textuel. Par défaut, le curseur textuel se trouve sur la première colonne de la ligne sous la dernière liste d'impression, dû au saut de ligne effectué à la suite de l'affichage d'une liste d'impression, sauf si la liste d'impression se termine par un point-virgule. Dans ce cas, le curseur textuel se déplace sur l'emplacement du caractère suivant sur la même ligne, sans insérer un espace ni saut de ligne.
PRINT "Une liste d'impression sans point-virgule."
PRINT "La liste suivante est sur la ligne suivant"
PRINT "Une liste d'impression " ;
PRINT "terminee par des " ;
PRINT "points-virgules... " ;
A la fin de l'affichage d'une liste d'impression, la position du curseur textuel est signifiée par un trait de soulignement clignotant. L'instruction OFF permet de masquer le curseur textuel à l'écran tandis que l'instruction ON permettra d'afficher de nouveau le curseur textuel s'il a été cacher précédemment.
REPEAT
OFF
PRINT "Le curseur est cache avec OFF."
PRINT "Appuyez une touche pour l'afficher."
kpause = GET
ON
PRINT "Le curseur est active avec ON."
PRINT "Appuyez sur Q pour quitter ou une autre touche pour refaire ..."
kpause$ = GET$
UNTIL kpause$ = "Q" OR kpause$ = "q"
END
L'instruction ON est un synonyme de la commande VDU 23 , 1 , 1 ; 0 ; 0 ; 0 ; .
L'instruction OFF est un synonyme de la commande VDU 23 , 1 , 0 ; 0 ; 0 ; 0 ; .
Il est possible de placer le curseur textuel sur une position définie, on utilisant la fonction TAB ( colonne , ligne ), où :
- colonne indique le rang de la colonne dans la surface textuelle et ;
- ligne indique le rang de la ligne dans la surface textuelle.
Attention, la fonction TAB() ne doit pas être utilisée seule, elle doit toujours être précédée d'une instruction PRINT.
Si la fonction TAB() est suivie d'une liste d'impression, celle-ci débutera à la position ( colonne , ligne ). Par contre, s'il n'y a pas de liste d'impression, et que la fonction TAB() :
- est suivie de point-virgule, la liste d'impression suivante débutera à la position ( colonne , ligne ) ;
- n'est pas suivie de point-virgule, la liste d'impression suivante débutera à la position ( 0 , ( ligne + 1 ) ).
PRINT "( 0 , 0 ) <<< origine du curseur textuel"
PRINT TAB( 14 , 5 ) ; ". <<< TAB ( 14 , 5 ) ;"
PRINT TAB( 3 , 17 ) ". <<< TAB ( 3 , 17 ) ;"
PRINT TAB( 10 , 8 ) ; ". <<< TAB ( 10 , 8 ) ;"
PRINT ". <<< ( 0 , 9 )"
PRINT TAB( 17 , 22 ) ;
PRINT ". <<< ( 17 , 22 )"
PRINT TAB( 24 , 12 )
PRINT ". <<< ( 0 , 13 )"
PRINT TAB( 37 , 19 ) ; ". <<< TAB ( 37 , 19 ) ;"
Notez que le curseur textuel se trouve, à la fin de ce ( 0 , 20 ). Si on ne donnait pas la liste d'impression : ". <<< TAB ( 37 , 19 ) ;", le curseur textuel se placerait en ( 37 , 19 ).
On pourra ainsi déplacer le curseur textuel en fonction des besoins du programme. Par exemple :
PRINT "Appuyez sur les touche fleches pour deplacer le curseur,"
PRINT "ou sur Q pour quitter."
kcolonne = 40
kligne = 12
REPEAT
PRINT TAB( kcolonne , kligne ) ;
ktouche$ = GET$
CASE ASC( ktouche$ ) OF
WHEN 136 : kcolonne -= 1
WHEN 137 : kcolonne += 1
WHEN 138 : kligne += 1
WHEN 139 : kligne -= 1
ENDCASE
UNTIL ktouche$ = "Q" OR ktouche$ = "q"
PRINT "Fin du test. Au revoir."
END
La forme TAB( colonne ) à un comportement différent.
Si colonne est inférieure à la valeur retournée par l'instruction COUNT, le curseur textuel sautera à la colonne colonne de la lignes suivante. Des caractères d'espacement, code ASCII 32, seront affichés de la colonne 0 à la colonne colonne - 1.
MODE 8
PRINT "BBC BASIC for SDL 2.0" ;
ksymboles$ = STR$( COUNT ) : REM - retourne le nombre de symboles affichée sur la ligne courante
COLOUR 2 : COLOUR 132
PRINT TAB( 12 ) : REM - place le curseur textuel à la colonne 13 sur la ligne suivante
PRINT STR$( GET( 10 , 1 ) ) : REM - affiche le code ASCII du symbole en colonne 10 de la ligne 1
PRINT ksymboles$ : REM - affiche le nombre de symboles affichée sur la ligne 0
Si colonne est supérieur ou égal à la valeur retournée par l'instruction COUNT, le curseur textuel est déplacé à la colonne colonne sur la lignes courante. Des caractères d'espacement, code ASCII 32, seront affichés de la colonne ayant la valeur de COUNT à la colonne colonne - 1.
MODE 8
PRINT "BBC BASIC for SDL 2.0" ;
ksymboles$ = STR$( COUNT ) : REM - retourne le nombre de symboles affiches sur la ligne courante
COLOUR 2 : COLOUR 132
PRINT TAB( 30 ) : REM - place le curseur textuel à la colonne 30 sur la ligne courante
PRINT STR$( GET( 28 , 0 ) ) : REM - affiche le code ASCII du symbole en colonne 28 de la ligne 0
PRINT ksymboles$ : REM - affiche le nombre de symboles affiches sur la ligne 0
N.B. : Dans les deux exemples ci-dessus, les valeurs numériques sont converties en valeurs alphanumériques pour ne pas être affichées en tenant compte des zones d'affichage.
Pour connaitre la position actuelle du curseur textuel, on utilisera l'instruction :
- POS, qui retourne le rang de la colonne, ou abscisse, du curseur textuel ;
- VPOS, qui retourne le rang de la ligne, ou ordonnée, du curseur textuel.
MODE 8
REPEAT
CLS
PRINT TAB( 21 , 30 ) "Appuyez sur Q pour quitter ou sur"
PRINT TAB( 25 , 31 ) "une autre touche pour refaire."
PRINT TAB( RND( 75 ) , RND( 25 ) ) ;
kcolonne = POS
kligne = VPOS
PRINT "+ <<< ( " ; STR$( kcolonne ) ; " , " ; STR$( kligne ) ; " )"
kpause$ = GET$
UNTIL kpause$ = "Q" OR kpause$ = "q"
PRINT "Fin du test. Au revoir."
END
L'instruction COUNT retourne le nombre de caractères affichés sur la ligne où se trouve le curseur textuel, c'est-à-dire, le numéro de la colonne où se trouve le dernier caractère de la ligne accueillant le curseur textuel.
FOR kvaleur = 1 TO 3
PRINT STRING$( kvaleur , "-" ) ; COUNT ;
NEXT kvaleur
FOR kvaleur = 1 TO 3
PRINT STRING$( kvaleur , "-" ) ; COUNT
NEXT kvaleur
retourne
-1--4---8
-1
--2
---3
Rappel : les caractères affichés à l'aide de la commande VDU ne contribuent pas à la valeur retournée par l'instruction COUNT. C'est pourquoi l'utilisation de la commande VDU pour afficher des caractères devrait rester réservée à l'envoi de caractères de controle, code de 1 à 31.
PRINT "BBC Basic" ; COUNT : REM - Retourne BBC Basic9
VDU 66 ; 66 ; 67 ; 32 ; 66 ; 97 ; 115 ; 105 ; 99
PRINT "BBC Basic" ; COUNT : REM - Retourne BBC BasicBBC Basic9
ANALYSE DU CONTENU DE LA SURFACE TEXTUELLE.
L'instruction GET$( colonne , ligne ) permet de connaitre le symbole présent à une certaine position de la surface textuelle, en le retournant dans une chaine de caractères, tandis que l'instruction GET( colonne , ligne ) retourne le code ASCII du symbole présent à une position donnée.
colonne doit être un nombre entier compris entre 0 et le nombre de colonnes de la surface textuelle.
ligne doit être un nombre entier compris entre 0 et le nombre de lignes de la surface textuelle.
Si les coordonnées ( colonne , ligne ) se trouvent en dehors de la surface textuelle :
- GET() retournera - 1 ;
- GET$() retournera une chaine vide, "".
Si aucun symbole n'a été affiché aux coordonnées ( colonne , ligne ) :
- GET() retournera 32 ;
- GET$() retournera un caractère d'espacement, " ".
Si le programme utilise une police au standard UTF-8 pour l'affichage des caractères, la fonction GET$() peut alors retourner une chaine de caractères de 1, 2 ou 3 octets, en fonction du code UTF-8 du symbole retourné.
MODE 8
PRINT "BBC BASIC"
FOR kvaleur = 0 TO 12
PRINT "Symbole en ( " ; kvaleur ; " , " ; kvaleur ; " ) : " ; GET$( kvaleur , kvaleur ) ;
PRINT " (code ASCII : " ; GET( kvaleur , kvaleur ) ; ")."
NEXT kvaleur
PRINT "Symbole en ( 20 , 20 ) :" ; GET$( 20 , 20 ) ;
PRINT " (code ASCII : " ; GET( 20 , 20 ) ; ")."
END
Note;: l'utilisation de standard autre que l'ASCII pour l'affichage des caractères, peut retourner des valeurs non fiables lors de l'utilisation des fonctions GET() et/ou GET$(), en particulier si on utilise des polices de caractères à espacement proportionnel, ou plusieurs de polices.
GESTION ET MODIFICATION DU CURSEUR TEXTUEL.
L'utilisation de la commande VDU 23 permet de modifier les comportements par défaut du curseur textuel et de l'affichage d'une liste d'impression. Certaines de ces possibilités sont résumés ci-dessous. Voir la commande VDU 23 pour une description plus détaillée de chacune d'elles.
Modifier l'apparence du curseur textuel.
Par défaut, le curseur textuel est le symbole du trait de soulignement _ et celui de l'insertion est un caractère plein ▮ en mode refrappe. Mais il est possible de modifier l'aspect du curseur en indiquant quelles sont les lignes de la matrice du curseur textuel doivent être de la couleur de l'avant-plan, ainsi que la largeur des lignes.
La commande VDU 23 , 0 , 10 ; h ; 0 ; 0 ; où h indique quelle sera la première ligne, ligne haute, de la matrice du curseur à afficher en avant-plan. h doivent être un nombre entier, compris entre 0 et 31.
La commande VDU 23 , 0 , 11 ; b ; 0 ; 0 ; où b indique quelle sera la dernière ligne, ligne basse, de la matrice du curseur à afficher en avant-plan. b doit être un nombre entier, compris entre 0 et 31, mais h doit être inférieur à b.
La commande VDU 23 , 0 , 18 ; e ; 0 ; 0 ; où e indique quelle sera la largeur, en pixels, des lignes du curseur affichées en avant-plan. e doit être un nombre entier, compris entre 0 et la largeur d'un caractère, qui dépend du MODE de la fenêtre de sortie. Si e est égal à 0, valeur par défaut, la largeur des lignes sera calculée en fonction de la largeur moyenne des caractères de la fonte actuelle.
Attention à bien respecter les virgules et les points-virgules, et surtout de ne pas omettre le dernier point-virgule.
REPEAT
CLS
INPUT "Ligne haute (de 0 a 31) " ; khaut
INPUT "Ligne basse (de 0 a 31 mais > ligne haute) " ; kbas
INPUT "Largeur du curseur " , klargeur
VDU 23 , 0 , 10 , khaut ; 0 ; 0 ; 0 ;
VDU 23 , 0 , 11 , kbas ; 0 ; 0 ; 0 ;
VDU 23 , 0 , 18 , klargeur ; 0 ; 0 ; 0 ;
PRINT "Q pour quitter, autre touche pour refaire ... " ;
kchoix$ = GET$
UNTIL kchoix$ = "Q" OR kchoix$ = "q"
PRINT "Fin du test. Au revoir."
END
Déplacement du curseur textuel.
Pour déplacer le curseur textuel on pourra utiliser la commande :
VDU 8, pour déplacer le curseur de texte d'un caractère vers la gauche ;
VDU 9, pour déplacer le curseur de texte d'un caractère vers la droite ;
VDU 10, pour déplacer le curseur de texte d'une ligne vers le bas ;
VDU 11, pour déplacer le curseur de texte d'une ligne vers le haut ;
VDU 13, pour déplacer le curseur de texte à l'origine, colonne 0, de la ligne courant ;
VDU 30, pour déplacer le curseur de texte dans le coin supérieur gauche de l'écran ;
VDU 31 , colonne , ligne , pour déplacer le curseur de texte à une position précise ;
VDU 127, pour déplacer le curseur graphique d'un caractère sur la gauche en l’effaçant.
De plus la commande VDU 23 , 7 , m ; d ; 0 ; 0 ; permet de déplacer manuellement le curseur textuel dans la surface textuel ou dans la fenêtre de sortie :
- m détermine la zone à faire défiler. Si :
- m vaut 0, le défilement s'applique à la toute la surface textuelle entière définie par VDU 28 ;
- m vaut 1, le défilement s'applique à la toute la fenêtre de sortie ;
- d détermine la direction du déplacement. Si :
- d vaut 0, le déplacement se fera vers la droite d'un caractère ;
- d vaut 1, le déplacement se fera vers la gauche d'un caractère ;
- d vaut 2, le déplacement se fera vers le bas d'un caractère ;
- d vaut 3, le déplacement se fera vers le haut d'un caractère.
REM --- Sur la fenetre de sortie ---
MODE 8
PRINT "Appuyez sur : "
PRINT "d pour deplacer vers la droite ;"
PRINT "g pour deplacer vers la gauche ;"
PRINT "b pour deplacer vers le bas ;"
PRINT "h pour deplacer vers le haut ;"
PRINT "q pour Quitter."
VDU 28 , 5 , 15 , 50 , 10
COLOUR 140
CLS
REPEAT
kordre$ = GET$
IF kordre$ = "d" THEN VDU 23 , 7 , 1 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "g" THEN VDU 23 , 7 , 1 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "b" THEN VDU 23 , 7 , 1 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "h" THEN VDU 23 , 7 , 1 , 0 , 0 ; 0 ; 0 ;
PRINT "BBC BASIC for SDL 2"
UNTIL kordre$ = "q"
END
REM --- Sur la surface textuelle ---
MODE 8
PRINT "Appuyez sur : "
PRINT "d pour deplacer vers la droite ;"
PRINT "g pour deplacer vers la gauche ;"
PRINT "b pour deplacer vers le bas ;"
PRINT "h pour deplacer vers le haut ;"
PRINT "q pour Quitter."
VDU 28 , 5 , 15 , 50 , 10
COLOUR 140
CLS
REPEAT
kordre$ = GET$
IF kordre$ = "d" THEN VDU 23 , 7 , 0 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "g" THEN VDU 23 , 7 , 0 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "b" THEN VDU 23 , 7 , 0 , 0 , 0 ; 0 ; 0 ;
IF kordre$ = "h" THEN VDU 23 , 7 , 0 , 0 , 0 ; 0 ; 0 ;
PRINT "BBC BASIC for SDL 2"
UNTIL kordre$ = "q"
END
Mouvement du curseur après l'affichage.
Par défaut, après l'affichage d'une liste d'impression, le curseur textuel se déplace sur la première colonne de la ligne de la ligne suivante, sous la liste d'impression qui vient d'être affichée. La commande VDU 23 ,16 , f ; 0 ; 0 ; 0 ;, où f est un nombre entier compris entre 0 et 127, correspondant à la valeur d'un octet où les bits indique un comportement spécifique pour le déplacement du curseur textuel après un affichage :
- si le bit 0 vaut (si le bit 0 est à 1, ajoutez 1 à f) :
- 0, le défilement en attente est activé (uniquement dans la surface textuelle, VDU 4) ;
- 1, CRLF est activé (uniquement dans la surface textuelle, VDU 4) ;
- si le bit 1 vaut (si le bit 1 est à 1, ajoutez 2 à f) :
- 0, la direction horizontale positive est vers la droite ;
- 1, la direction horizontale positive est vers la gauche ;
- si le bit 2 vaut (si le bit 2 est à 1, ajoutez 4 à f) :
- 0, la direction verticale positive est vers le bas ;
- 1, la direction verticale positive est vers le haut ;
- si le bit 3 vaut (si le bit 3 est à 1, ajoutez 8 à f) : :
- 0, la direction X, des abscisses, est horizontale tandis que la direction Y, des ordonnées, est verticale ;
- 1, la direction X, des abscisses, est verticale tandis que la direction Y, des ordonnées, est horizontale ;
- si le bit 4 vaut (si le bit 4 est à 1, ajoutez 16 à f) :
- 0, la fenêtre d'affichage du texte défile ou la page est éjectée ;
- 1, le curseur textuel s'enroule jusqu'au bord opposé de la fenêtre d'affichage/page ;
- si le bit 5 vaut (si le bit 5 est à 1, ajoutez 32 à f) :
- 0, le curseur textuel se déplace après la sortie d'un caractère ;
- 1, le curseur textuel ne bouge pas après la sortie d'un caractère ;
- si le bit 6 vaut (si le bit 6 est à 1, ajoutez 64 à f) :
- 0, le curseur textuel est forcé de rester dans la surface textuelle ou sur la page ;
- 1, le curseur textuel peut sortir de la surface textuelle ou sur de la page ;
- le bit 7 : doit toujours être à 0
Par exemple, si f vaut 90 (01011010 en binaire), alors :
- le défilement en attente est activé ;
- la direction horizontale positive est vers la gauche ;
- la direction verticale positive est vers le bas ;
- X est verticale et Y est horizontale ;
- le curseur s'enroule jusqu'au bord opposé ;
- le curseur se déplace après la sortie d'un caractère ;
- le curseur peut sorti de la surface ;
- le bit 7 est toujours à 0 (false).
RUBRIQUES.
Les dessins et les graphismes pour plus de détails les fonctions de dessins du BBC BASIC.
La gestion des couleurs pour plus de détails sur la gestion des couleurs logiques et physiques.
Les caractères personnalisés pour pour plus de détails sur la création de caractères personnalisés.
Les valeurs des code ASCII pour plus de détails sur la correspondance des signes et leur code ASCII.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
avec un exemple de résolution à télécharger pour vous inspirer.