L'écran physique c'est ce que l'on voit sur notre moniteur, l'écran logique c'est une zone mémoire qui sera compatible avec le précédent et dans laquelle nous pourrons afficher ou préparer un certain nombre de choses. Il est bien entendu possible de créer plusieurs écrans logiques.

Remarque : sur Atari, c'est ce qui se fait avec ~XBIOS(5,L:XBIOS(3),L:XBIOS(2),res)

Voici comment notre exemple a évolué depuis la fois dernière:

' ---> Ecrans Physique et Logique en GFA Windows ' OPENW #1,_X / 2 - 320,_Y / 2 - 200,640,400,%001110000 TITLEW #1,"SOTB !" ' Hscreen1& = CREATEBMP(640,400) Hsc1& = MEMDC(_DC(1)) SETBMP Hsc1&,Hscreen1& ' SETDC Hsc1& IF EXIST("fond.bmp") adr& = LOADBMP("fond.bmp") PUT 0,0,adr& FREEBMP adr& ENDIF SETDC _DC(1) REPEAT PEEKEVENT IF MENU(1) = 21 @redraw ENDIF UNTIL MENU(1) = 4 CLOSEW #1 END ' PROCEDURE redraw BITBLT Hsc1&,0,0,640,400,_DC(1),0,0,SRCCOPY RETURN

Les nouveautés

À la 3ème ligne, on réserve une zone mémoire correspondant à la taille de notre image de fond, soit 640x400 pixels... Hscreen1& = CREATEBMP(640,400)

Instruction :

adr& = CREATEBMP(w&,h&)

avec w& = largeur en pixels et h& = hauteur en pixels

L'adresse de la zone réservée est renvoyée dans Hscreen1& (pour "Hidden screen1", mais vous pouvez la nommer toto& si vous voulez...

Device Context

Ensuite on définit un Device Context (DC) compatible avec l'écran physique (en GFW _DC(1) contient l'adresse de l'écran physique donc celui que l'on voit) avec l'instruction MEMDC(DC):

Hsc1& = MEMDC(_DC(1))

Je n'ai pas trouvé de traduction claire pour "Device Context"... je dirai "Contexte d'affichage". En effet un dessin contient un certain nombre de couleurs, une certaine organisation des bits en fonction du mode graphique... donc cette instruction permet dans notre cas de créer un contexte d'affichage compatible avec l'écran que nous sommes en train de regarder

L'instruction suivante SETBMP Hsc1&,Hscreen1& applique le contexte d'affichage créé précédemment à la zone mémoire de 640x400 que nous avons réservée.

Nous avons donc à l'issue de ces 3 instructions une zone mémoire cachée de 640x400 pixels compatible avec celle qui est affichée dans notre fenêtre sur l'écran visible !

Redirection des instructions graphiques

Ensuite SETDC Hsc1& indique que nous souhaitons que les prochaines instructions graphiques se fassent non plus sur l'écran physique mais sur l'écran logique. Dans notre cas ce sera le PUT quelques lignes plus bas !

Les lignes suivantes que du classique: on charge le fond en mémoire à l'adresse adr&, puis on l'affiche sur l'écran avec l'instruction PUT, sauf que l'image ne s'affichera pas dans notre fenêtre mais dans la zone mémoire compatible (écran logique) puisqu'on l'a demandé avec l'instruction SETDC Hsc1& !

Ensuite avec SETDC _DC(1) on redirige les instructions graphiques sur l'écran physique et on rentre dans notre boucle REPEAT/UNTIL bien connue.

Le redraw avec BITBLT

C'est au niveau du redraw que nous avons des changements, puisqu'au lieu de charger l'image sur le disque comme nous le faisions dans le second tutorial, on copie ici notre image qui se trouve dans l'écran logique sur l'écran physique avec l'instruction BITBLT

Instruction :

BITBLT adresse source,xs,ys,largeur,hauteur, adresse destination,xd,yd,mode

Le mode peut prendre plusieurs valeurs si nous souhaitons faire des opérations logiques, notamment pour l'affichage de sprites. Pour l'instant nous nous contenterons de SRCCOPY (la source est copiée telle quelle dans la destination)

Note : Vous pouvez trouver toutes les valeurs de mode dans l'aide du GFW...
Remarque : l'instruction BITBLT a la même syntaxe que RC_COPY en GFA

Bref ceux qui ont déjà réalisé des démos ou jeux sur Atari ST/Falcon doivent se rendre compte que c'est exactement la même chose en GFW, à part quelques instructions qui changent !!!

Il est bien sûr possible de créer plusieurs écrans logiques, c'est d'ailleurs ce que nous ferons pour l'écran de Shadow Of The Beast... puisque la prochaine fois nous animerons un peu ce fond !

Il est indispensable de bien comprendre ce système qui est la base de l'animation (démos, jeux)