Avec AMOS, vous pouvez combiner des graphismes IFF créés avec un logiciel de dessin pour produire des affichages époustouflants à l'écran, mais AMOS permet aussi de produire des graphismes par programmation plutôt que par dessin. Nous aborderons bientôt les Sprites, les Bobs et les écrans. Pour l'instant, contentons-nous d'examiner les routines de dessin dans AMOS, ainsi que quelques très jolis effets d'arc-en-ciel que l'on peut obtenir grâce à quelques astuces du coprocesseur graphique, appelé le Copper.
Utiliser un logiciel graphique sur l'Amiga est très facile, comme vous le savez. Il suffit de le lancer et de dessiner avec la souris. C'est une méthode très pratique pour produire les graphismes que l'on voit dans la plupart des jeux, mais qu'en est-il d'un autre type de graphismes informatiques, où l'accent est mis sur le mot « informatique » ? Les graphismes dessinés par l'ordinateur sont nés à une époque où le seul type de graphismes disponibles étaient des caractères imprimés sur une feuille de papier sortant d'un terminal télix. On pouvait imiter ce que l'on voulait représenter en utilisant des lettres, et beaucoup de jeux ne faisaient que faire courir une lettre H derrière une astérisque à l'écran. (Et c'était très amusant, je dois le dire. À l'époque, du moins.)
Ensuite sont arrivés les traceurs, et on pouvait non seulement taper une page de texte sur une imprimante standard, mais aussi produire des dessins fluides sur papier en utilisant divers stylos de couleurs. Les lignes dessinées par l'ordinateur étaient lisses et courbées, et on disait qu'elles étaient « tracées » plutôt que tapées ligne par ligne comme sur une imprimante normale.
Avec l'apparition des terminaux informatiques dotés d'écrans vidéo, les graphismes tracés ont été affichés à l'écran, mais le mot « tracé » est resté. Les pixels à l'écran ont remplacé les stylos sur le papier, et les graphismes informatiques tels que nous les connaissons sont nés. Les choses ont bien changé depuis, et le mot « graphismes » signifie aujourd'hui quelque chose de différent, mais on peut encore obtenir des effets très utiles à l'écran en dessinant plutôt qu'en peignant.
Pourquoi dessiner à l'écran avec AMOS plutôt qu'utiliser la souris et un programme de dessin ? Pour agrémenter vos excellents programmes AMOS, bien sûr. Par exemple :
Rem ** Snoutbox1.AMOS **
Rem
Curs Off : Flash Off : Cls 0
Paper 0
Box 0,0 To 319,100
Box 2,2 To 317,98
Locate ,4 : Centre "Title Box for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,12 : Centre " Snoutware (c)1992 "
C'est un moyen simple et rapide de créer un titre pour vos programmes. Cela dessine deux boîtes avec un espace de 2 pixels entre elles, puis positionne quelques lignes de texte, la dernière chevauchant le bas de la boîte. Il suffit de saisir le nom de votre programme et votre nom dans les chaînes centrées, et le tour est joué. J'ai mis un espace de chaque côté de la ligne Snoutware, juste pour rogner un peu la boîte aux extrémités.
On peut aller plus loin, par exemple ainsi :
Rem ** Snoutbox2.AMOS **
Rem
Curs Off : Flash Off : Cls 0
Paper 6
Ink 2 : Bar 0,0 To 319,100
Ink 6 : Bar 2,2 To 317,98
Locate ,4 : Centre "Title Box for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,10 : Pen 0 : Centre " Snoutware (c)1992 "
Cette fois, au lieu d'utiliser des boîtes, nous avons utilisé des barres, l'une plus petite que l'autre pour former une jolie bordure. Si vous voulez un effet encore plus chic, vous pouvez faire du 3D comme ceci :
Rem ** Snoutbox3.AMOS **
Rem
Curs Off : Flash Off : Cls 0
Paper 7
Ink 2 : Bar 0,0 To 319,100
Ink 8 : Bar 2,2 To 319,100
Ink 7 : Bar 2,2 To 317,98
Locate ,4 : Centre "Title Box for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,10 : Pen 0 : Centre " Snoutware (c)1992 "
Vous dessinez une barre pour les reflets en haut et à gauche, une autre pour les ombres en bas et à droite. Une barre de 0,0 à 319,100, puis une autre de 2,2 jusqu'à 319,100, enfin une dernière dans une teinte moyenne, par-dessus les deux autres, en laissant une marge de deux pixels autour. Simple effet de relief, mais ça n'a jamais fait de mal à Workbench 2.0 !
Vous pouvez aussi saupoudrer des motifs, par exemple avec cette autre variation de la barre d'intro :
Rem ** Snoutbox4.AMOS **
Rem
Curs Off : Flash Off : Cls 0
Paper 7
Ink 2 : Bar 0,0 To 319,100
Ink 8 : Bar 2,2 To 319,100
Set Pattern 5 : Ink 3,7 : Bar 2,2 To 311,93
Locate ,4 : Centre "Title Box for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,10 : Pen 0 : Centre " Snoutware (c)1992 "
C'est la version la plus sophistiquée à ce jour. Pour obtenir les motifs, vous devez avoir le fichier MOUSE.ABK
chargé dans une banque, car il contient tous les motifs. Vous le trouverez dans le répertoire AMOS_SYSTEM de la disquette AMOS. Notez comment j'ai ajusté les couleurs d'encre et de papier au fond. Cela donne un très bel effet. Pour modifier les motifs, vous pouvez utiliser n'importe quel éditeur de sprites, comme SpriteX.
Pour aller au-delà des motifs prédéfinis, vous pouvez utiliser un numéro de motif inférieur à zéro, et même avoir des motifs animés ! Essayez ceci :
Rem * Patternmania.AMOS *
Rem
Load "spritefile.abk"
Flash Off
Get Sprite Palette
Ink 15,0
Do
For N=1 To 22
Set Pattern -N
Wait Vbl
Bar 0,0 To 319,199
Next
Loop
Le fichier spritefile.abk
mentionné n'est pas encore dans votre mémoire. Vous devrez charger un fichier en mode direct pour tester. Tout sauf octopus.abk
devrait fonctionner. Peut-être quelque chose de Sprite600
? Une fois le programme saisi, lancez-le, et vous verrez l'effet. En ajustant soigneusement la taille des sprites, vous pouvez obtenir des motifs animés très exotiques et hypnotiques.
Tracer des pixels ou dessiner des lignes est un tout autre domaine. En traçant des pixels individuellement, vous pouvez faire n'importe quoi, des champs d'étoiles aux fractales, en passant par des images en ray tracing, tout ce qu'il vous faut, ce sont les algorithmes. Vous pouvez tracer la trajectoire d'une fusée ou dessiner un graphique montrant combien de fois votre petite amie vous a planté. (C'est douloureux, je sais.)
Pour créer des effets de bas-relief 3D, vous pouvez simplement dessiner une série de lignes colorées sur le dessus et les côtés d'une barre (boîte remplie). Vous pouvez faire des astuces similaires avec des polygones remplis, en utilisant les commandes Polygon
et Polyline
, comme ceci :
Rem * Polybox1.AMOS *
Rem
Curs Off : Flash Off : Cls 0
Paper 7 : Ink 7
Polygon 0,20 To 20,0 To 299,0 To 319,20 To 319,80 To
299,100 To 20,100 To 0,80 To 0,20
Ink 2
Polyline 0,20 To 20,0 To 299,0 To 298,1 To 20,1 To 1,20
Ink 8
Polyline 319,20 To 319,80 To 299,100 To 20,100 To 21,99
To 299,99 To 318,80 To 318,20
Locate ,4 : Centre "Polygon Title for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,10 : Centre " Snoutware (c)1992 "
Utiliser des motifs est aussi une bonne idée :
Rem * Polybox2.AMOS *
Rem
Curs Off : Flash Off : Cls 0
Paper 7 : Ink 7,8 : Set Pattern 8
Polygon 0,20 To 20,0 To 299,0 To 319,20 To 319,80 To
299,100 To 20,100 To 0,80 To 0,20
Ink 2
Polyline 0,20 To 20,0 To 299,0 To 298,1 To 20,1 To 1,20
Ink 8
Polyline 319,20 To 319,80 To 299,100 To 20,100 To 21,99
To 299,99 To 318,80 To 318,20
Locate ,4 : Centre "Pattern Polygon for AMOS programs"
Locate ,6 : Centre "by Phil South"
Locate ,10 : Centre " Snoutware (c)1992 "
Cela vous donne une variété de moyens de créer des écrans de texte plus intéressants avec un minimum de code.
Concernant le traçage de points individuels à l'écran, vous pouvez devenir fou en traçant des fractales (bien que ce soit mieux fait ligne par ligne, comme nous le verrons plus tard), mais l'une des utilisations les plus populaires des points individuels est sans doute le champ d'étoiles. Les champs d'étoiles, ce sont ces effets que vous voyez dans Star Trek sur l'écran principal quand le Capitaine Kirk (ou Picard, pour les amateurs) dit « Affichez-le sur l'écran principal ». On voit alors les étoiles filer et un gros vaisseau extraterrestre menacer l'Enterprise. Bon, on ne peut pas faire le vaisseau (enfin, peut-être en tant que Bob), mais je peux vous montrer rapidement le champ d'étoiles.
Rem * Starfield.AMOS *
Rem
Screen Open 0,320,200,16,Lowres
Curs Off : Flash Off
Cls 0
Double Buffer
Hide
CX=Screen Width/2 : CY=Screen Height/2
Update Off
Autoback 0
STARS=20
Dim X(STARS),Y(STARS)
Dim X_STEP(STARS),Y_STEP(STARS)
Dim C(STARS)
For ST=0 To STARS
Gosub INIT_STEP
PHASE=Rnd(CY)/16
X(ST)=PHASE*X_STEP(ST)
Y(ST)=PHASE*Y_STEP(ST)
C(ST)=Rnd(14)+1
Next ST
Do
Cls 0
For ST=0 To STARS
Gosub MOVE
Next ST
Screen Swap
Loop
End
INIT_STEP:
X_STEP(ST)=8-Rnd(16)
Y_STEP(ST)=8-Rnd(16)
Return
MOVE:
Add X(ST),X_STEP(ST)
Add Y(ST),Y_STEP(ST)
X=X(ST)
Add X,CX
Y=Y(ST)
Add Y,CY
If X<0 Or X>Screen Width Or Y<0 Or Y>Screen Height
Gosub INIT_STEP
X(ST)=0
Y(ST)=0
End If
Plot X,Y,2
Return
Joli, non ? Je pourrais rester à regarder ça pendant des heures. Bien sûr, vous pouvez ajuster le flux des étoiles en fonction de l'entrée du joystick, ce qui donne une sensation de mouvement dans l'espace. Il suffit de modifier la procédure MOVE pour qu'elle accepte les données du stick via la commande JOY
, puis de les intégrer dans l'algorithme MOVE pour faire défiler les points d'étoiles vers le haut ou le bas selon la direction. Ou pourquoi ne pas faire une vue de côté comme si vous regardiez par le hublot latéral d'un vaisseau spatial ?
En utilisant les mêmes principes que pour la boîte de titre, vous pouvez aussi créer des boîtes de dialogue style Workbench 2 en 3D, avec un peu de dessin bien pensé et une procédure très astucieuse :
Rem * 3D_Req.AMOS *
Rem
Default
Paper 0 : Pen 2 : Cls : Curs Off
REO[" A 3D Requester"," Neat eh? ","Continue",""]
Print "Please press S to Stop"
Z=0
Procedure MAIN
Shared Z
Do
K$=Upper$(Inkey$)
If K$="S" Then REO["You S for Stop","Did you?","OK","Cancel"]
If Mouse Key=2 Then REO["You hit the Right Mouse Button","Did you?","Yes","Cancel"]
If Z=1 Then REO["Okay Quit, see if I care","So long",""]
If Z=2 Then Z=0
Loop
End Proc
Procedure REO[T1$,T2$,B1$,B2$]
Shared Z
Screen Open 7,640,60,4,Hires
Screen Display 7,130,110
Limit Mouse 215,110 To 350,155
Show
Flash Off
Paper 0 : Cls : Curs Off
Palette $0,$444,$777,$FFF
Reserve Zone 2
If Len(T1$)>33 Then T1$=Left$(T1$,33)
If Len(T2$)>33 Then T2$=Left$(T2$,33)
If Len(B1$)>8 Then B1$=Left$(B1$,8)
If Len(B2$)>8 Then B2$=Left$(B2$,8)
Ink 1 : Bar 170,0 To 470,52
Ink 3 : Bar 171,1 To 410,59
Ink 2 : Bar 171,1 To 468,58
Ink 0 : Box 180,10 To 458,30
Ink 3 : Draw 130,30 To 453,30
Ink 3 : Draw 458,30 To 458,10
If Len(B1$)>0 Then
Ink 3 : Box 200,37 To 270,52
Ink 0 : Draw 200,52 To 270,52
Ink 0 : Draw 270,52 To 270,37
End If
If Len(B2$)>0 Then
Ink 3 : Box 350,37 To 430,52
Ink 0 : Draw 360,52 To 430,52
Ink 0 : Draw 430,52 To 430,37
End If
Ink 0,2
Text 184,19,T1$
Text 184,27,T2$
Text 204,47,B1$
Text 364,47,B2$
If Len(B1$)>0 Then Set Zone 1,200,37 To 270,52
If Len(B2$)>0 Then Set Zone 2,360,37 To 430,52
Do
Z=Mouse Zone
If Z=1 And Mouse Key=1 Then
Ink 0 : Box 200,37 To 270,52
Ink 3 : Draw 200,52 To 270,52
Ink 3 : Draw 270,52 To 270,37
Bell 70 : Wait 10 : Screen Close 7 : Limit Mouse : Pop Proc
End If
If Z=2 And Mouse Key=1 Then
Ink 0 : Box 360,37 To 430,52
Ink 3 : Draw 360,52 To 430,52
Ink 3 : Draw 430,52 To 430,37
Bell 40 : Wait 10 : Screen Close 7 : Limit Mouse : Pop Proc
End If
Loop
End Proc
Un petit bout de code génial, et merci à Chris Hurst pour l'idée originale. Voilà, Chris, comme promis, tu es célèbre dans le monde entier !