Obligement - L'Amiga au maximum

Vendredi 19 avril 2024 - 04:08  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : AmigaBasic - les graphismes
(Article écrit par Christian Sager et extrait d'A-News (Amiga News) - janvier 1990)


L'Amiga se distingue des autres grâce à son graphisme et au son. Il a donné une autre dimension à la micro dite "familiale". Oui, vous avez une machine fantastique entre vos mains mais... il y a un mais. A quoi sert de posséder une si belle machine si on ne sait pas l'utiliser ? Et voilà que le petit démon de la programmation vous interpelle.

Amorce de la programmation

A un moment ou un autre, une idée vous obsède : comment font-ils pour réaliser tout ça ? Je pourrais le faire aussi ? Si je ne veux pas me contenter de faire avaler des disquettes à mon ordinateur, il faut que ça change !

Je ne vous rappelle pas mon introduction mais vous signale encore que le BASIC est un moyen pour que ça change. Ne craignez pas de me dire si mon langage vous paraît abscons. Je disais donc, ou si je ne le disais pas c'est fait, que l'AmigaBasic gère toutes les possibilités de votre ordinateur avec des commandes formidables. Fini le temps des PEEK et des POKE interminables, ses adresses que l'on doit connaître par coeur. Apprenez avec ma série sur le BASIC une nouvelle manière de programmer en BASIC.

Le BASIC de l'Amiga est un interpréteur d'une nouvelle génération. Plus besoin de numéros de lignes. On peut utiliser des noms de variable avec plusieurs caractères, ce qui augmente la lisibilité des programmes. De nouvelles commandes pour vous permettre d'appeler un bloc par une variable alphanumérique pour des sous-routines. C'est devenu un vrai plaisir que de programmer. Regardez un programme bien fait : l'indentation, les routines... Et voilà ! Je viens de vous faire franchir un pas vers la programmation.

Connaissez vous FOR... NEXT ou IF... THEN... ELSE ? Peu importe pour le moment. Ce que je veux vous faire comprendre, la raison pour la quelle je tiens de tels propos, la raison même de mes explications, c'est de montrer qu'il n'y a pas que de la logique mais aussi une valeur artistique dans la programmation, quelqu'elle soit. Non, ne souriez pas bandes de fanatiques du clavier. Comme disait un ancêtre : "Ce qui se conçoit bien, ce programme clairement" et un programme doit être clair, limpide. Je n'ai pas voulu vous faire ingurgiter les théories de la programmation structurée, en commençant d'ailleurs par un rappel de la notion d'organigramme. Pfuit !

Mais je me permets quand même de vous dire : faites un petit plan. J'ai vu d'incroyables programmes fonctionner impeccablement mais quand j'ai lu le programme source, je me suis demandé par quel hasard ce programme fonctionnait. Vous vous dites "Eh bien, c'est le principal, ça tourne", mais si un petit détail (non pas historique), vous savez, un bout de texte pas à sa place... Bonjour les dégâts ! Modifications impossibles ! On centre un texte et des variables se modifient. C'était de l'ASM (abréviation d'assembleur ici). En BASIC, une commande prouve votre mauvaise programmation : GOTO. C'est la preuve d'une mauvaise conception. Mais comme annoncé précédemment, je vais vous parler de l'une des grandes qualités de votre Amiga : le graphique.

Graphique point par point

Exception faite de la philosophie de ce qui aurait un rapport direct avec l'écriture (c'est difficilement autrement), la théorie est réputée pour son côté sinistre. On a l'impression que c'est intentionnel. Plus vous êtes nébuleux et plus ça semble sérieux et intelligent ! Je vais donc essayer d'être transparent (pas intelligent mauvaises langues ! Non je ne l'ai pas dit !) et commencer de suite avec la pratique.

Vous êtes sensé avoir démarré le BASIC, avoir effectué mes modifications (voir mois dernier) et vous avez sur votre écran la fenêtre "Liste". C'est dans cette fenêtre que vous verrez apparaître votre programme lors du chargement par :

LOAD "NomDuProgramme"

...dans la fenêtre de sortie ou par la fonction du menu. Je ne veux pas vous faire écrire de programme (pour l'instant), alors fermez la fenêtre "Liste" en cliquant le symbole de fermeture de fenêtre en haut à gauche. Prêt ?

La première commande c'est une commande élémentaire graphique, à savoir : comment placer un point sur l'écran. Écrivez directement :

PSET(200,170)

...et regardez l'effet produit sur votre écran après avoir appuyé sur "Entrée". Votre point est là. Sa position est déterminée par les valeurs entre parenthèses, appelées aussi paramètres. Selon la configuration choisie, votre écran aura une résolution de 320x200 ou 640x200 points (les 200 représentent les lignes). En partant du coin haut gauche vous avez avec mon exemple la ligne 170 (la 171e en réalité puisque la numérotation commence avec 0) et la ligne 201. Voici les coordonnées de votre point (voir graphique 1). Je vous parlerais donc de coordonnées x-y, cela conviendrait peut être mieux à certains lecteurs, moi ça me convient.

AmigaBasic

Maintenant que vous savez afficher un point sur l'écran, il peut être intéressant, voire nécessaire, d'effacer certains points d'un graphique par exemple. Faites :

PRESET (200,170)

Le point précédent vient de disparaître de l'écran. Faites quelques essais avec ces deux commandes pour vous familiariser avec les coordonnés. Autre manière qui vous permet de tirer un trait :

y=100
FOR x=35 TO 180
PSET (x,y)
NEXT x

Le plus dur pour un débutant ? C'est de débuter (La Palisse). C'est fait. Mais que fait la Police ? Ma petite programmation n'utilise pas encore les formidables possibilités graphiques de l'Amiga. Je vais donc corriger (partiellement) cette lacune. Autre paramètre avec PSET dont je n'ai pas encore parlé, c'est celui de la couleur. Sans aucune programmation, vous avez quatre couleurs à votre disposition dont : la bleue, la blanche, la noire et la rouge.

Elles sont représentées par les chiffres correspondants de 0, 1, 2 et 3. A la suite de la commande PSET vous pouvez donc accrocher l'un de ces chiffres. Sans paramètre de couleur, la valeur par défaut est 1 (blanche). Donc :

PSET(100,150),2

...vous place un point noir sur un fond bleu. Ces couleurs sont celles installées sous Preferences et figurent dans la configuration de votre disquette de Workbench. Mon premier exemple de programme (voir listing 1) utilise PSET et les quatre couleurs pour représenter un motif coloré.

AmigaBasic

Mais que fait la couleur

Vous devez avoir entendu parler des possibilités de couleurs de votre appareil et voilà que je ne vous parle que de quatre malheureuses couleurs ! Autant achetez un Oric (mais ça ne se vend plus hi hi, le mien est dans un placard) c'est pareil !

Pour utiliser plus de couleurs, il faut des explications supplémentaires. Plus il y a de couleur, plus il faut de place mémoire. Logique ! Pour certaines utilisations comme un traitement de texte ou des calculs, un choix important de couleurs est inutile. C'est pourquoi, l'installation standard se contente de quatre couleurs. Pour mon utilisation (la vôtre certainement aussi), c'est trop peu ! Nous allons donc définir un nouvel écran.

L'Amiga permet de définir, selon vos besoins, divers écrans (en anglais : "screen") avec une résolution et un choix de couleurs différents. Pour cela, utilisez la méthode suivante :

SCREEN Numéro,Largeur,Hauteur,Bitplanes,Résolution

Le numéro sert à identifier l'écran, la largeur et la hauteur définissent la taille de l'écran. Bitplanes est un nombre entier entre 1 et 5 et représente le rang des valeurs utilisables (2, 4, 8, 16 et 32). La résolution est un nombre entier entre 1 et 4 pour indiquer le nombre de points par écran avec 320x200 (basse résolution), 640x200 (haute résolution), ou 320x400 et 640x400 entrelacé. Comme dit précédemment, ouvrir un écran utilise beaucoup de mémoire. C'est avec :

SCREEN CLOSE Numéro

...que l'on récupère la place après en avoir fini avec l'écran. Je viens donc de vous fixer les particularités de l'écran.

Entrons par la fenêtre

Pour mon exemple sur le graphisme, il me fallait encore une fenêtre (en anglais : "window") à l'intérieur de l'écran. Vous faites :

WINDOW Numéro d'identification,"titre",(position haut gauche)-(position bas droite),type,Numéro SCREEN

Cela paraît compliqué à première vue mais vous allez vite comprendre avec mon exemple chiffré.

WINDOW 2,"Test-Fenêtre",(50,50-300,150),31,1

Comme dans SCREEN on peut omettre le numéro d'identification. Mais il ne faut pas utiliser la valeur 1 car l'AmigaBasic l'utilise pour sa propre fenêtre (output). Le titre apparaît dans la bande titre de la fenêtre. Sans donner de coordonnées, la fenêtre s'ouvre à la taille de votre SCREEN qui aura le même numéro que celui placé en fin d'instruction de WINDOW.

Le type indique l'influence de la souris sur la fenêtre. On peut ainsi déterminer si la fenêtre pourra se fermer avec la souris, se mettre en arrière-plan ou modifier sa taille (les gadgets). Pour les différentes valeurs, ouvrez votre livre AmigaBasic. Selon le nombre de plans de bits choisit, vous aurez l'usage de peu ou plusieurs couleurs. Des couleurs me direz-vous, mais jusqu'à présent, nulle part on n'a spécifié un choix quelconque pour indiquer une couleurs.

Le choix des couleurs est possible avec la commande PALETTE. Les couleurs ont des identificateurs de 0 jusqu'à maximum 31 (limitations : en 640x400 il n'y a que 16 couleurs de possible). Les couleurs à l'écran sont fixées, en principe, de la même manière que pour un vulgaire téléviseur : des trois couleurs de base RVB (rouge, vert, bleu) ou aussi RGB selon la langue adoptée (Rot, Grün, Blau). Par leur mélange on peut avoir de nombreuses couleurs.

En réalité, il n'y aurait que huit couleurs si l'on ne pouvait pas faire varier l'intensité de chaque couleur en seize paliers. On a donc la possibilité de représenter 16x16x16=4096 couleurs. La valeur des intensités est expliquée dans le livre du BASIC sous la commande PALETTE. La syntaxe de la commande ne devrait plus poser de problême.

PALETTE Numéro de couleur, Intensité Rouge, Intensité Vert, Intensité Bleu

Avec la commande "COLOR Avant-plan, Arrière-plan", on peut décider quelle couleur, définie précédemment avec PALETTE, serait utilisée comme arrière-plan ou avant-plan. La couleur de base pour l'avant-plan sert normalement au texte.

La commande graphique la plus simple offre beaucoup plus qu'il n'y paraît, car la commande LINE dessine non seulement une ligne mais aussi des quadrilatères et les remplit avec une couleur. En utilisant la commande :

LINE (coordonnées de début)-(coordonnées de fin), couleur

...l'ordinateur trace un trait entre ces deux valeurs, dans la couleur désirée. Sans donner de paramètre pour la couleur, la valeur par défaut est celle de la couleur actuelle de l'avant-plan. Si on n'indique pas de coordonnées de début, la ligne démarre à partir du dernier point tracé. Je dois encore vous indiquer qu'en mettant une virgule après la couleur, on peut ajouter un autre paramètre comme un B (pour Box) ou BE (pour Box Filled). Dans ce cas, les coordonnées de début seront interprétées comme coin en haut gauche, et de fin comme coin en bas droite d'un quadrilatère. En ajoutant un "B", il n'y aura qu'un cadre de tracé, avec "BF" on le remplit en plus par la couleur indiquée.

D'ellipses en cercle

Le dessin des cercles est déjà un peu plus compliqué. On peut s'en rendre compte rien qu'en lisant la syntaxe :

CIRCLE point central, rayon, couleur, début, fin, résolution

Avant de vous parler des finesses, apprenez la signification des paramètres. "Début" et "fin" représentent les angles (en radian) pris dans un arc (360 degrés = 2xPi, sens contraire des aiguilles d'une montre). De cette manière on peut tracer des éléments de cercle. Cela me semble encore simple. Je vais donc aborder les difficultés.

Pour avoir des cercles ronds, il faut utiliser la résolution 640x200. Le point de l'Amiga n'est pas carré mais c'est un triangle dont les côtés ont un rapport de 2,25:1. Donc dans une autre résolution, les cercles sont des ellipses. Cela paraît intéressant de changer de résolution pour avoir des ellipses, mais peut aussi être gênant. La constante Pi n'existe pas sur l'Amiga, pourtant les fonctions CIRCLE ou SIN en ont besoin. Pour remédier à ce manque, il vous suffit de définir au début de votre programme :

PI = 4 x ATN(1)

Avec ça, vous allez pouvoir dessiner des cercles avec exactitude. Exemple :

CIRCLE (150,50),100,1,PI,0,.5

C'est un demi cercle et "ATN" c'est la fonction arc tangente, inverse de tangente. La valeur de la tangente de l'angle Pi/4 représente 450 et est égale à 1. Comme je suis dans les maths, je vous donne aussi la constante "e" qui est donnée par e=EXP(1) :

zlog(x)=log(x)/log(10)

Si vous voulez écrire un programme pour tracer des fonctions, il serait vraiment intéressant de pouvoir changer de fonction pendant que le programme poursuit son exécution. C'est donc un petit programme qui lit la fonction comme une chaîne de caractères et l'insère dans le programme qu'il faudrait. Soyez sans crainte, j'ai déjà ce qu'il vous faut ! Je me demande si je dois vous l'écrire car pour le BASIC de l'Amiga, c'est facile. Allez, je vous le donne, mais avant le programme proprement dit, vous allez suivre le cheminement de la conception d'un programme (je ne ferais pas l'organigramme !).

Que doit faire ce programme ?
  • Lire la fonction avec INPUT.
  • Ouvrir un fichier séquentiel.
  • Transformer la fonction en fichier ASCII.
  • Nouer ce fichier avec le programme principal avec MERGE.
Avouez que jusqu'ici c'est plus que simple ? Et voici sa transposition en BASIC :

AmigaBasic

Un conseil : étudiez soigneusement ce petit programme. Le nouveau fichier est au mieux dans le RAM Disk, cela évite évidemment les accès au disque. Mais attention, le programme BASIC vous annoncera "current programm is not saved. Do you want to save it before processing". Vous répondrez allégrement "no".

Mon programme RGB (listing suivant) essaye d'intercepter cet effet, afin de ne pas dépendre du mode de l'écran.

AmigaBasic

La deuxième partie de RGB, vous offre une autre démonstration des capacités graphiques de l'Amiga : le défilement. Par défilement, on entend le stockage de partie d'écran :

SCROLL (coin haut gauche)-(coin bas droit),delta x,delta y

...déplace dans le quadrilatère spécifié les points de delta x points à droite et de delta y points vers le bas. Avec une programmation adéquate on peut déplacer un graphique sur l'écran :

FOR I=O TO 100
SCROLL (50+I)-(150+I),1,0
NEXT I

L'inconvénient de cette technique, c'est que la partie qui se déplace efface le fond en passant dessus. Si l'on ne recherche pas cet effet, il faut utiliser la combinaison de PUT et de GET. D'ailleurs, n'oubliez pas que ces deux commandes sont les plus exceptionnelles que vous ayez pour vos graphiques sur l'Amiga.

Pour utiliser ces commandes, il est nécessaire d'avoir une variable qui puisse supporter toutes les informations de la partie à déplacer. On comprend que l'on ne peut pas stocker tout un écran ou au moins que cela serait mal approprié. Pour trouver la taille nécessaire de cette variable, il faut utiliser la formule suivante :

Taille = Hauteur x INT ((Largeur+16)/16) x (Nombre de plans de bits) + 3

Après avoir déterminé la taille, vous pouvez avec :

GET (coin supérieur gauche)-(coin inférieur droit),variable%

...stocker l'image de la partie d'écran qui se trouvera donc dans la variable et on pourra la relire par :

PUT (coin supérieur gauche), variable %

...afin de placer la découpe à l'endroit de votre choix. Replacer la découpe sur l'image et celle-ci disparaît immédiatement.

Cela provient d'un autre paramètre qui s'ajoute à la commande PUT et qui indique de quelle manière la découpe est liée avec l'écran. D'office, le type d'action c'est XOR (ou exclusif) qui fait que tous les points de l'image qui sont présents dans la découpe et dans la fenêtre seront effacés. Les autres possibilités sont AND et OR et aussi PSET et PRESET.

Ces deux dernières placent la découpe sur l'écran sans s'occuper de ce qu'il y a à l'écran, PSET en normal et PRESET en inversion. Rien de plus facile que de sauvegarder sur disquette :

OPEN NomDuProgramme FOR OUTPUT AS Numéro
FOR i=0 TO (taille variable)
PRINT #Numéro, MKI$ (variable% (i));
NEXT i
CLOSE Numéro

Comme "Numéro", utilisez une valeur entière comprise entre 1 et 255. Après avoir exécuté ces cinq lignes, vous aurez sauvegardé votre graphique sur votre disquette.

Un mot encore sur la fonction MKI$. Elle transforme votre argument en une chaîne de deux octets (CHR$ étant une commande analogue mais que sur un octet). L'avantage de cette commande, c'est le gain de place (exemple : 30718 nécessitent cinq octets, MKI$ (30718) que deux octets) et l'intérêt de ce gain de place c'est la vitesse de chargement. Il est évident qu'à un moment ou un autre vous voulez reprendre un graphique que vous avez chargé. Utilisez mon programme suivant :

OPEN NomDuProgramme FOR INPUT AS Numéro
FOR I=O TO LOF (numéro)/2-1
Variable%(i) = CVI (INPUT$(2,Numéro))
NEXT I
CLOSE Numéro

La fonction LOF() possède la taille du fichier en octet, CVI (Convert to Integer) produit l'effet inverse de la commande MKI$ et INPUT$ (2,Numéro) lit deux octets du fichier ouvert.

La fonction "Pattern"

Jusqu'à présent nous avons tiré des traits pleins, rempli des surfaces pleines. Nous allons donc modifier cela avec la fonction "Pattern". La syntaxe est simple :

PATTERN ligne%,surface%

"ligne%" est une variable normale et "surface%" une variable multiple de 2 (c'est-à-dire 1, 2, 4, 8, 16...). La taille en BASIC est dimensionnée à 11, il faut toujours redimensionner cette variable avant d'utiliser la commande. N'oubliez pas que "surface%(0)" existe aussi.

A quoi servent ces variables ? Si vous faites un trait normal, vous placez des points les uns après les autres. Avec la variable "ligne%", vous pouvez décidez quel point vous voulez poser. La variable possède une valeur que l'Amiga interprète comme un modèle de 16 points. Voyez le graphique suivant qui vous montre comment faire.

BASIC

Chacun des 16 points a une valeur, vous faites la somme mais n'oubliez pas la valeur négative. Vous faites pareille pour "surface%". La seule différence, c'est que vous travaillez sur une surface.


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]