Et si on animait un peu ce fond (tutorial n°4)

Et si on animait un peu ce fond (tutorial n°4)

Messagede Fantomas » Ven 13 Aoû 2010 22:37

Si si (pas l'impératrice), la suite du tutorial commancé il y a ... pfff au moins ! Comme quoi ...:

Comme vous l'avez déjà peut-être remarqué j'ai uploadé une nouvelle image "Sotb.zip" qui contient, en plus du fond utilisé précédément, les sprites du personnage, nous les utiliserons la prochaine fois (ne soyez pas pressés non mais !)

Les plus perspicaces auront remarqué que le fond est décalé par rapport au bord gauche de l'image... On se calme ! Je vais de ce pas vous expliquer tout çà, pas de panique !

Le pricipe est simple, on va décaler (dans l'écran logique) chaque portion du fond vers la gauche d'un certain nombre de pixels pour donner un effet de scroll paralaxe comme dans SOTB, on va copier ce fond "décalé" dans un nouvel écran logique (ben oui, j'ai jamais dit qu'on ne pouvait avoir qu'un seul écran logique !)
En fin on va l'afficher sur notre moniteur (l'écran physique, bon ok il y en a deux qui suivent...)

Pourquoi cette étape du deuxième écran logique? ben pour pouvoir y placer notre personnage (on fera ça la prochaine fois, il ne faut pas abuser non plus !)

Code: Tout sélectionner
' ---------------------------------
' Tutorial "SOTB" n°4 -> Fond animé
' ---------------------------------
'
OPENW #1,_X / 2 - 320,_Y / 2 - 200,640,400,%001110000
TITLEW #1,"SOTB !"
'
Hscreen1& = CREATEBMP(800,600)
Hscreen2& = CREATEBMP(640,480)
Hsc1& = MEMDC(_DC(1))
Hsc2& = MEMDC(_DC(1))
SETBMP Hsc1&,Hscreen1&
SETBMP Hsc2&,Hscreen2&
'
FrameTime% = 10 ' Default is 100Hz (init Sync)
'
SETDC Hsc1&
IF EXIST("sotb.bmp")
adr& = LOADBMP("sotb.bmp")
PUT 0,0,adr&
FREEBMP adr&
ENDIF
SETDC _DC(1)
REPEAT
PEEKEVENT
IF MENU(1) = 21
@redraw
ENDIF
@anim_fond
@Sync
' Transfert Logic -> Physic
BITBLT Hsc2&,0,0,640,480,_DC(1),0,0,SRCCOPY
UNTIL MENU(1) = 4
CLOSEW #1
END
'
PROCEDURE redraw
BITBLT Hsc1&,0,0,640,400,_DC(1),0,0,SRCCOPY
RETURN
'
PROCEDURE anim_fond
' ------------------------------------------------------------
' Anime le fond et le transfère dans l'écran logique 2 (Hsc2&)
' ------------------------------------------------------------
' Nuage 0
BITBLT Hsc1&,15,0,640,42,Hsc1&,10,0,SRCCOPY
BITBLT Hsc1&,10,0,640,42,Hsc1&,635,0,SRCCOPY
' Nuage 1
BITBLT Hsc1&,14,42,640,80,Hsc1&,10,42,SRCCOPY
BITBLT Hsc1&,10,42,640,80,Hsc1&,636,42,SRCCOPY
' Nuage 2
BITBLT Hsc1&,13,122,640,38,Hsc1&,10,122,SRCCOPY
BITBLT Hsc1&,10,122,640,38,Hsc1&,637,122,SRCCOPY
' Nuage 3
BITBLT Hsc1&,12,160,640,18,Hsc1&,10,160,SRCCOPY
BITBLT Hsc1&,10,160,640,18,Hsc1&,638,160,SRCCOPY
' Montagnes
BITBLT Hsc1&,11,178,640,146,Hsc1&,10,178,SRCCOPY
BITBLT Hsc1&,10,178,640,146,Hsc1&,639,178,SRCCOPY
' Herbe 0
BITBLT Hsc1&,12,324,640,4,Hsc1&,10,324,SRCCOPY
BITBLT Hsc1&,10,324,640,4,Hsc1&,638,324,SRCCOPY
' Herbe 1
BITBLT Hsc1&,13,328,640,6,Hsc1&,10,328,SRCCOPY
BITBLT Hsc1&,10,328,640,6,Hsc1&,637,328,SRCCOPY
' Herbe 2
BITBLT Hsc1&,14,334,640,14,Hsc1&,10,334,SRCCOPY
BITBLT Hsc1&,10,334,640,14,Hsc1&,636,334,SRCCOPY
' Herbe 3
BITBLT Hsc1&,15,348,640,22,Hsc1&,10,348,SRCCOPY
BITBLT Hsc1&,10,348,640,22,Hsc1&,635,348,SRCCOPY
' Transfert Fond -> logic 2
BITBLT Hsc1&,10,0,640,366,Hsc2&,0,0,SRCCOPY
RETURN
'
PROCEDURE Sync
DO
Time% = TIMER
Delay% = Time% - OldTime%
IF Delay% < 0 THEN Delay% = FrameTime%
PEEKEVENT
EXIT IF Delay% > FrameTime%
LOOP
OldTime% = Time%
RETURN



Voici quelques explications sur le listing:

L'image qui contient le fond et les sprites du personnages fait 800x600 pixels, donc on réserve un écran logique "1" de 800x600 pixels: Hscreen1& = CREATEBMP(800,600)
L'ecran logique "2" quand à lui fait les dimensions du fond et de notre fenêtre soit 640x400 pixels: Hscreen2& = CREATEBMP(640,480)

On rend ces deux écran logiques compatibles avec le Contexte d'affichage, c'est ce que font les 2 lignes SETBMP suivantes.

On charge l'image avec le fond et les sprites dans l'écran logique "1".
Ensuite dans une boucle REPEAT/UNTIL on anime le fond via la procédure @anim_fond, puis on synchronise l'écran avec le balayage (je parlerai de ça un peu plus bas...) puis on transfère l'écran logique "2" dans l'écran physique (sinon on voit rien)
La boucle se termine quand on clique sur la croix de fermeture, et on redessine la fenêtre (redraw) si besoin.

La procedure anime_fond:

On décale chaque partie du fond d'un nombre différent de pixels vers la gauche. plus le décor est près, plus on décale pour donner un effet de profondeur et de vitesse (de 5 pixels plus le plus près à 1 pixel pour les montagnes du fond)
chaque partie qui est décalée sur la gauche est replacée à droite.
Tout se fait à l'aide de BITBLT (RC_COPY sur Atari). Sur PC c'est assez rapide, même non compilé.


La synchronisation:

Bon sur atari en GFA on a VSYNC pour synchroniser avec le balayage vidéo et avoir un affichage fluide à l'écran. en GFW y'à pas !
J'ai trouvé dans un exemple GFW cette procédure qui semble fonctionner...
Si quelqu'un à une autre astuce...

Et la suite ?

Maintenant que le fond bouge on va mettre le personnage qui court par dessus, et on aura un zouli écran comme celui de "Shadow Of The Beast"... je vous propose de tout vous expliquer au prochain tutorial !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Avatar de l’utilisateur
Fantomas
 
Messages: 43
Inscription: Dim 4 Jan 2009 11:52

Retourner vers GFA PC

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron