L'écran est votre toile dans AMOS, et c'est à vous de le remplir avec toutes sortes de couleurs, de formes et d'animations possibles, ce qui, avec AMOS, représente une palette assez vaste et très facile à exploiter. Les opérations d'écran dans AMOS vous permettent de créer, déplacer, façonner, déformer et généralement de griffonner sur les écrans de l'Amiga comme bon vous semble. Tout ce que vous pouvez écrire, imprimer, charger ou dessiner à l'écran peut être manipulé aussi facilement que si vous pliiez une feuille de papier. Il suffit de comprendre les commandes nécessaires, ce qui, comme toujours avec AMOS, est très facile à réaliser.
C'est la commande d'écran que vous utiliserez le plus souvent, et c'est ainsi que vous commencerez presque tous vos programmes, sauf si l'écran marron LOWRES par défaut convient à vos besoins.
Vous pouvez accéder à tous les modes écran de l'Amiga avec cette commande. Évidemment, si vous souhaitez avoir 80 colonnes de texte à l'écran, il vous faudra un écran de 640x256 :
Screen Open 0,640,256,16,Hires
Ce qui serait un bon départ pour tout programme utilitaire basé sur du texte. Les écrans en mode HAM (Hold and Modify) peuvent être ouverts avec :
Screen Open 0,320,256,4096,Lowres
ou quelque chose d'approchant. Cela vous permet de charger des images numérisées avec des périphériques HAM ou de créer des graphismes calculés sur un écran en mode HAM. Bien sûr, tous les écrans pour les dispositifs Digital Creations DCTV ou Black Belt Systems HAM-E seront tout aussi faciles à charger, car ce sont essentiellement des versions complexes des écrans Amiga classiques, avec les données de couleur supplémentaires codées dans le bitmap quelque part en cours de route. Consultez la documentation technique de ces dispositifs pour connaître les types d'écran à utiliser. En guise de guide, je dirais qu'un écran Hires 16 couleurs est adapté pour les deux types, et une taille de 736x566 pour le DCTV serait idéale, car il est généralement en overscan sans bordure d'écran.
Probablement, au moment où vous lirez ceci, vous pourrez utiliser les nouveaux formats Super-hires, Super-hires-interlaced et Productivity disponibles avec la nouvelle puce Denise version 2 (comme celles présentes dans les modèles A3000, A500 et A600), peut-être dans une nouvelle version d'AMOS ? Il faudra attendre pour voir.
Les principaux types d'écran utilisés sur Amiga sont Lowres, Hires, HAM, ainsi que les variations en overscan. Vous avez aussi l'option du mode entrelacé, qui double la résolution verticale avec le léger inconvénient d'un peu de scintillement. L'entrelacement a été conçu pour être un mode adapté à la télévision pour les graphismes Hires, mais il trouve son utilité dans tout programme qui a besoin d'un peu plus de détails fins.
Pour ouvrir un écran entrelacé, utilisez simplement la syntaxe suivante :
Screen Open 0,640,400,16,Laced+Hires
Screen Open 0,320,400,16,Laced+Lowres
Screen Open 0,320,200,16,Laced
Laced est une fonction relativement récente d'AMOS qui n'a été ajoutée qu'à partir de la version 1.23 environ. Avant cela, il était impossible d'utiliser l'entrelacement sans manipulations complexes de doublement et de commutation d'écran. Ce n'est toujours pas parfait, et la fonction n'est pas sans limitations.
Dès qu'un seul écran est ouvert avec entrelacement, tous les autres deviennent entrelacés. L'entrelacement ne sera efficace que pour l'écran ouvert avec LACED. Tous les autres auront simplement leurs lignes doublées à l'écran, alors souvenez-vous de réinitialiser la fonction avant de passer à un affichage non entrelacé.
Le mode entrelacé est parfait pour afficher des images, mais tout ce qui est plus complexe, comme une animation par exemple, fonctionnera à moitié de vitesse. Donc, bien entendu, les jeux ne devraient pas être rédigés en mode entrelacé. Dès que le dernier écran entrelacé est fermé, l'affichage entier revient à un mode normal. Votre moniteur TV pourrait ne pas apprécier les changements rapides entre normal et entrelacé, donc ne le faites pas trop souvent. N'oubliez pas : un peu d'entrelacement, c'est bien.
Toutes les opérations normales sont disponibles sur les écrans entrelacés : Screen Offset, Screen Display, etc. Le seul petit problème provient du fait que l'entrelacement dans AMOS est géré par logiciel. Les bitplanes sont changés pendant le blanc vertical, et ce processus d'entrelacement particulier est interdit pendant le calcul d'une Copper list. Donc, si vous avez une Copper list importante, c'est-à-dire 4 écrans dont un est entrelacé, un arc-en-ciel multicolore, et ensuite un calcul Copper, l'écran entrelacé n'affichera que la moitié de l'image pendant le calcul. Rien ne peut être fait pour corriger cela, c'est simplement une limitation du système AMOS. Jusqu'à ce que le processus soit revu dans une future version, il faudra s'en contenter.
AMOS dispose de commandes très puissantes pour la manipulation des écrans et de leur contenu. Que faire, par exemple, pour déplacer des écrans une fois qu'ils sont définis et chargés ? La commande Screen Hide
permet de cacher un écran chargé et de l'envoyer ailleurs jusqu'à ce qu'il soit nécessaire. Pour le réafficher, il suffit d'utiliser la commande Screen Show
. Comme toujours avec AMOS, Show/Hide sont l'inverse l'un de l'autre.
Le meilleur endroit pour cacher un écran AMOS est bien sûr dans une banque de mémoire SPACKéE, sous forme d'image compressée, car cela utilise moins de mémoire. Reportez-vous au chapitre 2 concernant le Spacking pour plus de détails.
Et quoi d'autre ? La commande Screen Copy
est utilisée dans le cadre du processus de défilement total ou partiel d'écrans, en combinaison avec Def Scroll
, Scroll
et Screen Swap
, comme on le voit dans cet exemple :
Rem * Screen Copy.AMOS * Rem Load Iff "entrez ici le chemin de votre image",1 Screen Open 0,320,256,32,Lowres Get Palette 1 : Curs Off : Flash Off Screen Copy 1 To 0 : Screen 0 : Double Buffer : Bob Update Off S=2 Def Scroll 1,80,80 To 240,240,0,-S : Rem scroll screen Repeat For Y=0 To 199 Step S Scroll 1 Screen Copy 1,80,Y,240,Y+S To 0,80,240-S Screen Swap Screen Copy 1,80,Y,240,Y+S To 0,80,240-S Wait Vbl Next Y Screen Swap : Wait Vbl : Scroll 1 Until Mouse Key
L'écran choisi est chargé, et une zone définie par la commande Def Scroll
est défilée vers le haut à l'aide d'une boucle Repeat Until
. Cela se fait en douceur et de manière continue jusqu'à ce que le bouton de la souris soit pressé, moment où le programme s'arrête.
Screen Swap
utilise un écran invisible appelé écran logique (logical screen) sur lequel il effectue des rendus comme les défilements, comme dans notre exemple. Lorsque l'objet ou l'écran a été modifié, le résultat est copié vers l'écran réel. Les écrans logiques sont très utiles pour fluidifier des routines de rendu autrement lentes ou maladroites (voir aussi le Double Buffering). Essayez l'exemple précédent et modifiez les paramètres pour voir les différences selon les ajustements apportés à Def Scroll
et Screen Copy
.
C'est ici que les choses deviennent vraiment intéressantes. Dans le système d'affichage de l'Amiga, un dual playfield est une configuration où deux écrans Amiga sont visibles en même temps, superposés l'un sur l'autre, avec une transparence permettant de voir l'un à travers l'autre. C'est un effet très pratique pour ce que l'on appelle, dans les critiques de jeux, le parallax scrolling, comme dans le jeu Shadow of the Beast. (Il existe une excellente démo AMOS parodiant cet effet, appelée Madness Week, réalisée par un groupe de hackers AMOS français très doués nommés Syntex. Récupérez-la dans la bibliothèque AMOS PD, vous verrez ce que je veux dire.)
Pour obtenir un bon défilement parallaxe (contrairement à ce que vous pourriez lire dans certaines colonnes AMOS de magazines spécialisés Amiga), il est nécessaire de respecter certaines restrictions et de bien définir ce que vous attendez de vos écrans défilants. Si vous recherchez la vitesse pure et un défilement géré entièrement par le matériel, il faudra trouver un moyen de faire fonctionner le dual playfield correctement, ce qui est fastidieux car un des champs d'affichage finira toujours par se comporter de manière imprévisible une fois que vous faites défiler l'autre, comme on le voit dans certaines démos DP publiées dans les magazines. Cette méthode n'est donc recommandée que si vous êtes prêt à passer quelques semaines à expérimenter.
Un dual playfield plus lent est préférable, tant que vous n'avez pas besoin d'une vitesse d'exécution extrême ou d'un défilement pixel par pixel très rapide. La meilleure façon de faire est de réaliser une superposition d'un autre écran à l'aide des commandes Get
et Put Block
. Le meilleur défilement parallaxe est celui que l'on appelle parallax en bandes, où vous ne superposez pas. Il s'agit simplement de configurer vos Screen Copy
pour faire défiler l'écran en bandes distinctes, ce qui est la façon la plus simple et la plus rapide de procéder.
Il est important de garder le défilement lui-même très simple. Alors que certaines démos vues dans des magazines utilisent seulement la moitié de la hauteur de l'écran, elles font défiler tout l'écran ! La méthode correcte consiste à ne faire défiler que les zones contenant les bitmaps. Ainsi, vous ne gaspillez pas le temps processeur à faire défiler des parties de l'écran qui ne font pas partie de l'action.
En plus du défilement parallaxe, vous pouvez réaliser plusieurs autres effets nécessitant une certaine forme de transparence ainsi que deux effets se déplaçant en synchronisation, comme dans cet exemple basé sur une idée de Peter Hickman :
Rem * Dual Playfield1.AMOS * Rem Screen Open 0,320,48,8,Lowres Paper 0 : Pen 4 : Flash Off : Curs Off : Cls 0 Centre At(,0)+"Mastering AMOS" Centre At(,5)+"It's a breeze!" Wait Vbl : Screen Clone 2 Wait Vbl : Screen Clone 4 Screen Open 1,320,48,8,Lowres Flash Off : Curs Off : Cls 0 Wait Vbl : Screen Clone 3 Wait Vbl : Screen Clone 5 Dual Playfield 0,1 Dual Playfield 2,3 Dual Playfield 4,5 Screen Display 2,,200,, Screen Display 3,,200,, Screen Display 4,,130,, Screen Display 5,,130,, Def Scroll 1,0,0 To 320,56,0,1 Def Scroll 2,0,0 To 320,56,0,1 Def Scroll 3,0,20 To 320,34,0,-1 Def Scroll 4,0,20 To 320,34,0,1 Repeat Screen Copy 0,0,0,320,1 To 1,0,1 Screen Copy 1,0,47,320,48 To 0,0,47 Screen 0 Wait Vbl Scroll 1 Scroll 3 Screen 1 Scroll 2 Scroll 4 Until False
Le mode dual playfield est idéal chaque fois que vous souhaitez avoir deux écrans en mouvement simultanément à l'écran. Les meilleures applications sont bien entendu les jeux et les démos. Mais on peut aussi envisager une utilisation pour des titres vidéo, avec un peu de réflexion et d'imagination.
Une autre fonctionnalité, que nous avons déjà vue en action dans le dernier programme avec un très bon effet, est la commande Screen Display
. Une fois qu'un écran a été défini avec Screen Open
, vous pouvez le positionner sur l'écran du moniteur grâce à Screen Display
. Une fois qu'un écran a été affiché, il peut être déplacé avec Screen Offset
. Cela signifie que vous pouvez déplacer l'écran d'un seul pixel à la fois pour obtenir des défilements très fluides. Essayez cet exemple pour commencer :
Rem * Display and Offset.AMOS * Rem Screen Open 0,640,512,16,Hires Screen Display 0,128,45,320,200 Flash Off : Hide On : Curs Off : Cls 0 Load Iff "any hires screen.iff" Screen Copy 0,0,0,640,200 To 0,640,0 Screen Copy 0,0,0,640,200 To 0,0,200 X=0 Y=0 30 Screen Offset 0,X,Y X=X+1 : If X=640 Then 60 Goto 30 60 Y=200 : Screen Offset 0,X,Y X=X-1 : If X=0 Then 30 Goto 60
L'avantage des commandes Display
et Offset
est que vous pouvez même avoir différents types d'écrans, voire des résolutions différentes, alignés côte à côte à l'écran ! L'Amiga est l'un des rares ordinateurs à pouvoir effectuer ce genre de bascule d'affichage.
La plupart des programmes qui manipulent des écrans utilisent deux ou plusieurs des commandes disponibles pour charger, créer, placer et déplacer les écrans. L'une des moins utilisées est SCREEN CLONE
, et la raison est qu'elle n'est utile que dans très peu de cas, sauf si vous cherchez à répéter un défilement, comme dans le programme Display and Offset.AMOS. Mais voyons ce qui se passe si on devient fou et qu'on multiplie les écrans :
J'aimerais que vous considériez quelques options pour présenter vos graphismes dans un programme AMOS. D'accord, votre programme n'est pas un jeu, mais ce n'est pas une raison pour qu'il soit moche ou ennuyeux. En plus des commandes de mouvement d'écran plus complexes comme celles que nous venons de voir, il existe d'autres types d'effets qui ressemblent davantage à ceux que l'on voit à la télévision. Deux des outils de présentation à votre disposition sont FADE
et APPEAR
, mais il y en a beaucoup d'autres.
Fade
fait exactement ce que son nom suggère : si vous voulez fondre vers le noir ou même vers une autre couleur, cette commande est faite pour ça. L'effet est le même que dans un film, si quelque chose est affiché à l'écran, vous pouvez le faire disparaître progressivement en utilisant la commande Fade
.
Fade [vitesse]
permet de contrôler la vitesse de la transition. Si vous ne précisez aucune couleur, le fondu se fera vers le noir. Pourquoi fondre vers autre chose que du noir ? Par exemple, si vous affichez un grand logo à l'écran, vous pouvez le faire disparaître en rouge, puis afficher les instructions de votre programme en blanc par-dessus. Très classe.
Vous pouvez également fondre vers la palette d'un autre écran actif, de cette façon :
Fade [vitesse] To [x]
où x
est le numéro de l'écran contenant la nouvelle palette.
Rem * Fade demo.AMOS * Rem DO S$=Fsel$("*.*","","L0ad yourself a screen") : If S$="" Then Edit FADIFF[S$] Wait Key : Fade 2 : Wait 16*2 Loop Procedure FADIFF[A$] Fade 1 : Wait 16 Auto View Off Load Iff A$,0 : Screen Clone 1 : Screen To Front 0 For X=0 To 31 : Colour X,0 : Next View : Auto View On Fade 3 To 1 : Screen Close 1 End Proc
Appear
est une toute autre histoire, bien que similaire à certains égards. Avec cette commande, vous pouvez faire une transition progressive entre deux écrans :
Appear 0 To 1,20
Cette commande transforme une image en une autre, et le dernier nombre définit le style de transition. Les meilleurs effets sont obtenus avec des nombres impairs qui ne sont pas divisibles par 5 — aussi étrange que cela paraisse. Essayez plusieurs valeurs avec ce programme :
Rem * Appear.AMOS * Rem F$=Fsel$("*.*","","Select a picture") If F$="" Then Edit Load Iff F$,1 If Screen Width>600 Then REZ=Hires Else REZ=Lowres Screen Open 0,Screen Width,Screen Height,Screen Colour,REZ Screen Open 2,320,50,2,Lowres Screen Display 2,,250,,50 Screen Open 3,320,10,2,Lowres Screen Display 3,,40,,10 Screen 0 : Screen To Front 0 : Get Palette(1) : Screen To Front 2 Screen To Front 3 Flash Off DO Screen 2 : Input "Enter effect ";E If E>0 Cls : Screen 0 Appear 1 To 0,E End If Loop
Chaque fois que vous entrez un effet, l'écran vide est transformé pour révéler l'écran en dessous. Bon, ce n'est pas un fondu aussi fluide que ceux de la télé, mais que voulez-vous pour ce prix ? Un studio de télé dans une boîte ? On parie que oui.
Une bonne règle à suivre pour utiliser Appear
et Fade
: placez-les dans des PROCs
, cela garantit leur bon fonctionnement.
Rem * Appear Proc.AMOS * Rem Procedure _APPEAR[S,D,X] Appear S To D,X End Proc
Rem * Fade Proc.AMOS * Rem Procedure _FADE[S] Fade S Wait S*15 End Proc
Cela permet de garder les choses simples, et si vous intégrez ces PROCs
au fur et à mesure (en utilisant Merge
), vous ne pouvez pas vous tromper.
La quantité d'effets spéciaux que vous pouvez réaliser avec AMOS n'est limitée que par votre maîtrise du langage, car il permet tous les niveaux de compétence, du BASIC au code machine. Et si vous en savez beaucoup, vous pouvez faire beaucoup. Mais les routines vraiment belles sont souvent les plus simples, comme cette sélection de superbes routines d'origine signée James Lanng :
Rem * Linesleft.AMOS * Rem Procedure _LINESLEFT[CL,LINES] Ink CL For B=Screen Width/LINES To 0 Step -1 For A=LINES To 0 Step -1 Draw Screen Width/LINES*A+B,0 To Screen Width/LINES*A+B,Screen Height Next A Next B End Proc
Cette PROC effectue un simple effacement de droite à gauche avec la couleur spécifiée dans CL
, et sur la portion d'écran allant de 0 à 320 que vous spécifiez dans LINES
.
Bien entendu, on peut faire l'inverse :
Rem * Linesright.AMOS * Rem Procedure _LINESRIGHT[CL,LINES] Ink CL For B=0 To Screen Width/LINES For A=0 To LINES Draw Screen Width/LINES*A+B,0 To Screen Width/LINES*A+B,Screen Height Next A Next B End Proc
Ou encore, vous pouvez réaliser deux balayages simultanés depuis le bas à droite et le haut à gauche :
Rem * Bottomright.AMOS * Rem Procedure _BOTTOMRIGHTTOPLEFT[CL] Ink CL For A=0 To Screen Width Draw A,0 To A,Screen Height/2 Draw Screen Width-A,Screen Height/2+1 To Screen Width-A,Screen Height Next A Next B End Proc
Par extension, vous pouvez aussi faire des balayages haut et bas simultanés :
Rem * Leftup.AMOS * Rem Procedure _LEFTUPRIGHTDOWN[CL] Ink CL For A=0 To 320 Draw 0,A To 160,A Draw 160,250-A To 320,250-A Next A End Proc
Bien que ces effets soient très malins (bravo James !), ils ne manipulent pas vraiment les écrans autant qu'ils les recouvrent de manière agréable. Pour un vrai bidouillage d'écran, il va falloir aller un peu plus loin.
Aucune discussion sur les effets spéciaux d'écran dans AMOS ne serait complète sans mentionner Splerge. Splerge est une routine brillante écrite par mon pote Peter Hickman, apparue il y a un certain temps et qui a été diffusée sur CIX, publiée dans des magazines, et utilisée par tout le monde depuis la nuit des temps. Je ne me souviens pas de la dernière démo que j'ai vue qui n'utilisait pas évidemment Splerge ou une variante. C'est un effet de grande classe, et il faut un esprit déviant comme celui de Pete et la puissance de programmation d'AMOS pour le créer :
Rem * Splerge procedure by Peter Hickman 1991 * Rem Procedure _SPLERGE[SPEED,SOURCE,DEST] Screen SOURCE SOURCE_SIZE=Screen Height Screen DEST DEST_SIZE=Screen Height V=Min(SOURCE_SIZE,DEST_SIZE) Screen SOURCE SOURCE_SIZE=Screen Width Screen DEST DEST_SIZE=Screen Width H=Min(SOURCE_SIZE,DEST_SIZE) For LOP=V-SPEED To 0 Step -SPEED For LOP1=0 To LOP Step SPEED Screen Copy SOURCE,0,LOP,H,LOP+SPEED To DEST,0,LOP1 Next LOP1 Next LOP End Proc
Saisissez ce code et observez le résultat. Ce que vous faites ici, c'est prendre un écran source (de préférence un IFF chargé ou un écran SPACKé) et le copier ligne par ligne (ou du moins par tronçons linéaires) sur un autre écran vide. D'une certaine manière, vous le faites glisser jusqu'à la fin. Le nom “Splerge” vient de l'effet final, qui donne l'impression que l'écran se déverse de l'un à l'autre.