5 : Écrans

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.

Screen Open

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.

Écrans entrelacés

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.

Cache-cache

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.

Dual Playfield

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.

Exemple de Dual Playfield

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.

Afficher cet écran !

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.

Screen Clone

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 :

Effets spéciaux

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]
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.

Procédures pour Appear et Fade

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.

Encore plus d'effets spéciaux

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.

Allons-y avec Splerge !

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.

← Retour au sommaire