Tutorial #1-3: Ecrans "logiques" et ecran "physique"






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écedent et dans laquelle nous pourrons afficher ou préparer un certain nombre de choses. Il est bien entendu possible de créer plusieurs écran 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:

A la 3ème ligne, on réserve ue zone mémoire correpondant à 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é est renvoyée dans
Hscreen1& (pour "Hidden screen1", mais vous pouvez la nommez toto& si vous voulez...

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 cet 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édement à 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 !

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. Das 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 (ecran 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.

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 acec l'instruction
BITBLT

Instruction: BITBLT adresse source,xs,ys,largeur,hauteur, adresse destination,xd,y&,mode

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

Vous pouvez trouver toutes les valeur 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 écran 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 indispendable de bien comprendre ce système qui est la base de l'animation (démos, jeux)