Graphiques
Le QBASIC et le QuickBASIC offre de nombreuses instructions graphiques et des fonctions pour créer une grande variété de formes, de couleurs et de motifs sur votre écran. Avec les graphiques, vous pouvez ajouter une dimension visuelle à presque n'importe quel programme, qu'il s'agisse d'un jeu, d'un outil pédagogique, d'une application scientifique ou d'un montage financier. Ainsi, le QBASIC et le QuickBASIC offre les possibilités d'effectuer tâches graphiques suivantes :
- Utilisez le système de coordonnées physiques de l'écran de votre ordinateur personnel pour localiser les pixels individuels, activer ou désactiver ces pixels et modifier leurs couleurs
- Tracer des lignes
- Dessinez et remplissez des formes simples, telles que des cercles, des ovales et des boîtes
- Restreindre la zone de l'écran affichant la sortie graphique en utilisant les ports d'affichage
- Ajustez les coordonnées utilisées pour localiser un pixel en redéfinissant les coordonnées de l'écran
- Utiliser la couleur dans la sortie graphique
- Créez des motifs et utilisez-les pour remplir des figures jointes
- Copiez les images et reproduisez-les dans un autre emplacement de l'écran
- Animation de la sortie graphique
Ce dont vous avez besoin pour les programmes graphiques
Pour exécuter les exemples graphiques, votre ordinateur doit avoir une capacité graphique, intégrée ou sous la forme d'une carte graphique telle que l'adaptateur graphique couleur CGA (Color Graphics Adapter), l'adaptateur graphique amélioré EGA (Enhanced Graphics Adapter) ou la carte graphique vidéo VGA (Video Graphics Array). Vous avez également besoin d'un écran vidéo (monochrome ou couleur) prenant en charge les graphiques à base de pixels. Gardez également à l'esprit que ces programmes nécessitent tous que votre écran soit dans l'un des modes d'écran prenant en charge la sortie graphique. Le mode d'écran contrôle la clarté des images graphiques, le nombre de couleurs disponibles et la partie de la mémoire vidéo à afficher. Pour sélectionner un mode de sortie graphique, utilisez l'instruction suivante dans votre programme avant d'utiliser l'une des instructions graphiques ou fonctions décrites par la suite.
SCREEN mode |
Ici, le mode peut être 1, 2, 3, 4, 7, 8, 9, 10, 11, 12 ou 13, selon la combinaison moniteur / adaptateur installée sur votre ordinateur. Si vous n'êtes pas sûr que les utilisateurs de vos programmes disposent ou non de matériel prenant en charge les graphiques, vous pouvez utiliser le test simple suivant :
- CONST FALSE = 0, TRUE = NOT FALSE
- 'Test pour vous assurer que l'utilisateur dispose d'un matériel doté d'une capacité couleur/graphique:
- ON ERROR GOTO Message ' Activez la détection des erreurs.
- SCREEN 1 ' Essayez le mode graphique un.
- ON ERROR GOTO 0 ' Désactivez le recouvrement des erreurs.
- IF NoGraphics THEN END ' Fin si aucun matériel graphique.
- ' :
- END
- ' Routine de gestion des erreurs:
- Message:
- PRINT "Ce programme nécessite des capacités graphiques."
- NoGraphics = TRUE
- RESUME NEXT
Si l'utilisateur n'a qu'un affichage monochrome sans carte graphique, l'instruction SCREEN produit une erreur qui à son tour déclenche une branche vers la routine de gestion des erreurs Message.
Pixels et coordonnées d'écran
Les formes et les figures sur un écran vidéo sont composées de points de lumière individuels appelés éléments d'image ou «pixels» (ou parfois comme «pels») en abrégé. Le QuickBASIC dessine et peint sur l'écran en activant ou désactivant ces pixels et en changeant leurs couleurs. Un écran typique est composé d'une grille de pixels. Le nombre exact de pixels dans cette grille dépend du matériel que vous avez installé et du mode d'écran que vous avez sélectionné dans l'instruction SCREEN. Plus le nombre de pixels est élevé, plus la clarté de la sortie graphique est élevée. Par exemple, une instruction SCREEN 1 donne une résolution de 320 pixels horizontalement par 200 pixels verticalement (320 x 200 pixels), tandis qu'une instruction SCREEN 2 donne une résolution de 640 x 200 pixels. La densité horizontale plus élevée en mode écran 2 (640 pixels par ligne contre 320 pixels par ligne) donne aux images un aspect plus net et moins irrégulier qu'en mode écran 1. Selon la capacité graphique de votre système, vous pouvez utiliser d'autres modes d'écran prenant en charge des résolutions encore plus élevées (ainsi que régler d'autres caractéristiques d'écran). Lorsque votre écran est dans l'un des modes graphiques, vous pouvez localiser chaque pixel au moyen de paires de coordonnées. Le premier nombre de chaque paire de coordonnées indique le nombre de pixels du côté gauche de l'écran, tandis que le second nombre de chaque paire indique le nombre de pixels du haut de l'écran. Par exemple, en mode écran 2, le point dans le coin supérieur gauche extrême de l'écran a les coordonnées (0,0), le point au centre de l'écran a les coordonnées (320,100) et le point dans l'extrême inférieur droit du coin de l'écran a des coordonnées (639, 199). Le QuickBASIC utilise ces coordonnées d'écran pour déterminer où afficher les graphiques (par exemple, pour localiser les extrémités d'une ligne ou le centre d'un cercle). Les coordonnées graphiques diffèrent des coordonnées en mode texte spécifiées dans une instruction LOCATE. Premièrement, LOCATE n'est pas aussi précis : les coordonnées graphiques indiquent les pixels individuels sur l'écran, alors que les coordonnées utilisées par LOCATE sont des positions de caractères. Deuxièmement, les coordonnées en mode texte sont données sous la forme «ligne, colonne», comme l'exemple suivant :
C'est l'inverse des coordonnées graphiques, étant données sous la forme «colonne, ligne». Une instruction LOCATE n'a aucun effet sur le positionnement de la sortie graphique à l'écran.
Dessin de formes de base: points, lignes, boîtes et cercles
Vous pouvez transmettre des valeurs de coordonnées aux instructions graphiques QuickBASIC pour produire une variété de figures simples.
Tracer des points avec PSET et PRESET
Le niveau de contrôle le plus fondamental sur la sortie graphique consiste simplement à activer et désactiver des pixels individuels. Vous faites cela en QuickBASIC avec les instructions PSET (pour l'ensemble de pixels) et PRESET (pour la réinitialisation des pixels). L'instruction PSET(x, y) donne au pixel à l'emplacement (x, y) la couleur de premier plan actuelle. L'instruction PRESET(x, y) donne au pixel situé à l'emplacement (x, y) la couleur d'arrière-plan actuelle. Sur les moniteurs monochromes, la couleur de premier plan est la couleur utilisée pour le texte affiché et est généralement blanche, ambre ou vert clair; la couleur d'arrière-plan des moniteurs monochromes est généralement noire ou vert foncé. Vous pouvez choisir une autre couleur pour PSET et PRESET à utiliser en ajoutant un argument de couleur facultatif. La syntaxe est alors :
PSET(x,y), color |
ou
PRESET (x, y), color |
Parce que PSET utilise la couleur de premier plan actuelle par défaut et PRESET utilise la couleur d'arrière-plan actuelle par défaut, le PRESET sans paramètre de couleur efface un point dessiné avec PSET, comme indiqué dans l'exemple suivant :
Bien qu'il soit possible de dessiner n'importe quelle figure en utilisant uniquement des instructions PSET pour manipuler des pixels individuels, la sortie a tendance à être plutôt lente, car la plupart des images sont constituées de nombreux pixels. Le QuickBASIC a plusieurs instructions augmentant considérablement la vitesse à laquelle des figures simples - telles que des lignes, des boîtes et des ellipses - sont dessinées.
Dessiner des lignes et des boîtes avec LINE
Lorsque vous utilisez PSET ou PRESET, vous ne spécifiez qu'une seule paire de coordonnées puisque vous ne traitez qu'un seul point à l'écran. Avec LINE, vous spécifiez deux paires, une pour chaque extrémité d'un segment de ligne. Le format la plus simple de l'instruction LINE est la suivante :
LINE (x1, y1)- (x2, y2) |
où (x1, y1) sont les coordonnées d'une extrémité d'un segment de ligne et (x2, y2) sont les coordonnées de l'autre. Par exemple, l'instruction suivante trace une ligne droite entre le pixel avec les coordonnées (10,10) et le pixel avec les coordonnées (150,200) :
Notez que QuickBASIC ne se soucie pas de l'ordre des paires de coordonnées : une ligne de (x1, y1) à (x2, y2) est identique à une ligne de (x2, y2) à (x1, y1). Cette situation signifie que vous pouvez également écrire l'instruction précédente comme suit :
Cependant, l'inversion de l'ordre des coordonnées peut avoir un effet sur les instructions graphiques suivant.
Utilisation de l'option STEP
Jusqu'à ce point, les coordonnées de l'écran ont été présentées comme des valeurs absolues mesurant les distances horizontales et verticales à partir du coin supérieur gauche extrême de l'écran, ayant des coordonnées (0,0). Cependant, en utilisant l'option STEP dans l'une des instructions graphiques suivantes, vous pouvez définir les coordonnées suivant STEP par rapport au dernier point référencé à l'écran :
Si vous imaginez des images dessinées à l'écran par un petit pinceau exactement de la taille d'un pixel, le dernier point référencé est l'emplacement de ce pinceau, ou curseur graphique, lorsqu'il a terminé de dessiner une image. Par exemple, les instructions suivantes laissent le curseur graphique sur le pixel avec les coordonnées (100,150) :
Si la prochaine instruction graphique du programme est :
- PSET STEP(20, 20)
alors le point tracé par PSET n'est pas dans le quadrant supérieur gauche de l'écran. Au lieu de cela, l'option STEP a défini les coordonnées (20,20) par rapport au dernier point référencé, qui a des coordonnées (100,150). Cela rend les coordonnées absolues du point (100 + 20,150 + 20) ou (120,170). Dans le dernier exemple, le dernier point référencé est déterminé par une instruction graphique précédente. Vous pouvez également établir un point de référence dans la même instruction, comme indiqué dans l'exemple suivant :
- ' Définit une résolution de 640 x 200 pixels et placez le dernier point référencé au centre de l'écran:
- SCREEN 2
- ' Trace une ligne entre le coin inférieur gauche de l'écran et le coin supérieur gauche:
- LINE STEP(-310, 100) -STEP(0, -200)
- ' Dessine les marches d'escalier du coin supérieur gauche vers le côté droit de l'écran:
- FOR I% = 1 TO 20
- LINE -STEP(30, 0) ' Tracez la ligne horizontale.
- LINE -STEP(0, 5) ' Tracez la ligne verticale.
- NEXT
- ' Dessinez les segments de ligne verticaux non connectés du côté droit vers le coin inférieur gauche:
- FOR I% = 1 TO 20
- LINE STEP(-30, 0) -STEP(0, 5)
- NEXT
- DO: LOOP WHILE INKEYS = "" ' Attendez une frappe de touche
Notez la boucle DO vide à la fin du dernier programme. Si vous exécutez un programme QuickBASIC compilé et autonome produisant une sortie graphique, votre programme a besoin d'un mécanisme comme celui-ci à la fin pour maintenir la sortie à l'écran. Sinon, il disparaît de l'écran avant que l'utilisateur n'ait le temps de le remarquer.
Boîtes à dessin
En utilisant les formes de l'instruction LINE déjà présentées, il est assez facile d'écrire un programme court reliant quatre lignes droites pour former une boîte, comme indiqué ici :
Cependant, QBASIC et QuickBASIC fournissent un moyen encore plus simple de dessiner une boîte, en utilisant une seule instruction LINE avec l'option B (pour boîte). L'option B est illustrée dans l'exemple suivant, produisant la même sortie que les quatre instructions LINE du programme précédent :
Lorsque vous ajoutez l'option B, l'instruction LINE ne relie plus les deux points que vous spécifiez avec une ligne droite; à la place, il dessine un rectangle dont les coins opposés (en haut à gauche et en bas à droite) sont aux emplacements spécifiés. Deux virgules précèdent le B dans le dernier exemple. La première virgule fonctionne ici comme un espace réservé pour une option inutilisée (le paramètre de couleur), ce qui vous permet de choisir la couleur d'une ligne ou des côtés d'une boîte. Comme précédemment, peu importe l'ordre dans lequel les paires de coordonnées sont données, le rectangle du dernier exemple peut également être dessiné avec cette instruction :
- LINE (170, 170)-(50, 50), , B
L'ajout de l'option F (pour le remplissage) après que B remplit l'intérieur de la boîte avec la même couleur que celle utilisée pour dessiner les côtés. Avec un affichage monochrome, c'est la même que la couleur de premier plan utilisée pour le texte affiché. Si votre matériel a des capacités de couleur, vous pouvez changer cette couleur avec le paramètre de couleur facultatif. La syntaxe introduite ici pour dessiner une boîte est la syntaxe générale utilisée dans QBASIC ou QuickBASIC pour définir une région graphique rectangulaire, et elle apparaît également dans les instructions GET et VIEW :
{GET | LINE | VIEW ) (x1,y1)-(x2,y2),... |
Ici, (x1, y1) et (x2, y2) sont les coordonnées des coins diagonalement opposés du rectangle (en haut à gauche et en bas à droite).
Dessiner des lignes pointillées
Précédemment, nous expliquions comment utiliser LINE pour dessiner des lignes pleines et les utiliser dans des rectangles; autrement dit, aucun pixel n'est ignoré. En utilisant encore une autre option avec LINE, vous pouvez à la place dessiner des lignes en pointillés ou en pointillés. Ce processus est appelé style de ligne. Voici la syntaxe pour dessiner une seule ligne en pointillés du point (x1, y1) au point (x2, y2) en utilisant la couleur de premier plan actuelle.
LINE(x1,y1)-(x2,y2),,[[B]], style |
Ici, le style est un entier décimal ou hexadécimal de 16 bits. L'instruction LINE utilise la représentation binaire du paramètre de style de ligne pour créer des tirets et des espaces vides, avec un 1 bit signifiant «activer le pixel» et un 0 bit signifiant «laisser le pixel désactivé». Par exemple, l'entier hexadécimal &HCCCC est égal à l'entier binaire 1100110011001100, et lorsqu'il est utilisé comme paramètre de style, il trace une ligne alternant deux pixels activés, deux pixels désactivés.
L'exemple suivant montre différentes lignes en pointillés produites à l'aide de différentes valeurs de style :
- SCREEN 2 ' Résolution de 640 x 200 pixels
- ' Style de données:
- DATA &HCCCC, &HFF00, &HF0F0, &HF000, &H7777, &H8888
- Row% = 4
- Column% = 4
- XLeft% = 60 : XRight% = 600
- Y% = 28
- FOR 1% = 1 TO 6
- READ Style%
- LOCATE Row%, Column%
- PRINT HEX$ (Style%)
- LINE (XLeft%, Y%)-(XRight%,Y%), , , Style%
- Row% = Row% + 3
- Y% = Y% + 24
- NEXT