[Tut] 2D mario-like / scrolling & affichage multicouche
Publié : sam. 25/févr./2006 12:38
Bonjour à tous. pour ceux que cela intéresse voici un exemple
de gestion du scrolling & paralax pour un mario-like.
c'est une des techniques utilisé pour le début de mon pseudo sonic
http://purebasic.hmt-forum.com/viewtopi ... sc&start=0
J'aurais aimer diffuser les sources, mais j'ai tout perdu
j'ai essayé de commenter un maximum le code.
de gestion du scrolling & paralax pour un mario-like.
c'est une des techniques utilisé pour le début de mon pseudo sonic
http://purebasic.hmt-forum.com/viewtopi ... sc&start=0
J'aurais aimer diffuser les sources, mais j'ai tout perdu

j'ai essayé de commenter un maximum le code.
;*********************
;*Scrooling & paralax*
;*Par Cpl.Bator *
;* 25/02/06 3.94 *
;*********************
; Voici un exemple d'utilisation du scrolling de tile en multi-couche
; C'est tout simple, tout les tiles sont ranger dans un tableau a 2 dimension (X,Y)
; on les affiches de la droite vers la gauche, du haut vers le bas, le tout par rapport au scrolling
; .............
; .............
; .............
; ...>>>etc
; Chaque bloc (tile) peut avoir des paramètres spécifiques à définir dans sa structure(animations,mouvement,etc...)
; dans cette exemple les paramètres sont simple, position en X & Y , et le type de bloc.
; il est possible d'optimiser le code, notament l'affichage des tiles, mais pour une raison de simplicité
; et de compréhension , le code est réduit au plus simple possible.
InitSprite ()
InitKeyboard ()
OpenScreen (1024,768,32, "" )
#Taille_niveauX = 100 ; Taille du niveau en X = 100 * taille du bloc en X
#Taille_niveauY = 100
#Taille_blocX = 64
#Taille_blocY = 64
Global Scrolling_vitesse.f , Scrolling_X.f , Scrolling_Y.f
Scrolling_vitesse = 10.0
; Structure des blocs.
Structure Map_struct
X.f
Y.f
Bloc_Type.l
EndStructure
;Pour chaque couches on affecte un tableau a deux dimension d'une taille du niveau choisi en X & Y
;la Couche A represente le ciel donc l'arriere plan, la B un niveau intermédiare, la A l'avant plan.
Dim Map_Couche_A.Map_struct( #Taille_niveauX , #Taille_niveauY )
Dim Map_Couche_B.Map_struct( #Taille_niveauX , #Taille_niveauY )
Dim Map_Couche_C.Map_struct( #Taille_niveauX , #Taille_niveauY )
;Remplisage aléatoire du niveau
; Donc le bloc en Map_couche_..(0,0) sera le premier en haut à gauche du niveau
; & le bloc Map(#Taille_niveauX,#Taille_niveauY) le dernier en bas à droite du niveau
; on les ranges de gauche à droite en descendant
For Y = 0 To #Taille_niveauY
For X = 0 To #Taille_niveauX
; Remplisage de la couche A *************
Map_Couche_A(X,Y)\X = X * #Taille_blocX
Map_Couche_A(X,Y)\Y = Y * #Taille_blocY
Map_Couche_A(X,Y)\Bloc_Type = 1
;****************************************
; Remplisage de la couche B *************
Map_Couche_B(X,Y)\X = X * #Taille_blocX
Map_Couche_B(X,Y)\Y = Y * #Taille_blocY
Map_Couche_B(X,Y)\Bloc_Type = 2 + Random (3)
;****************************************
; Remplisage de la couche C *************
Map_Couche_C(X,Y)\X = X * #Taille_blocX
Map_Couche_C(X,Y)\Y = Y * #Taille_blocY
Map_Couche_C(X,Y)\Bloc_Type = 6
;****************************************
Next X
Next Y
;Creations des sprites faisant office de bloc
TransparentSpriteColor (-1,255,0,255) ; utilise cette couleur comme transparente pour tout les sprites
CreateSprite (1, #Taille_blocX , #Taille_blocY )
CreateSprite (2, #Taille_blocX , #Taille_blocY )
CreateSprite (3, #Taille_blocX , #Taille_blocY )
CreateSprite (4, #Taille_blocX , #Taille_blocY )
CreateSprite (5, #Taille_blocX , #Taille_blocY )
CreateSprite (6, #Taille_blocX , #Taille_blocY )
; Dessine le ciel
StartDrawing ( SpriteOutput (1))
For Y = 1 To #Taille_blocY
Box (0,Y, #Taille_blocX ,1, RGB (100-y, 255-y, 255))
Next
StopDrawing ()
; Dessine blocs
StartDrawing ( SpriteOutput (2))
Box (0,0, #Taille_blocX , #Taille_blocY ,$3696A9)
Box (0,0, #Taille_blocX ,16,$518D5A)
StopDrawing ()
StartDrawing ( SpriteOutput (3))
Box (0,0, #Taille_blocX , #Taille_blocY ,$3D6AA2)
Box (0,0, #Taille_blocX ,16,$518D5A)
StopDrawing ()
StartDrawing ( SpriteOutput (4))
Box (0,0, #Taille_blocX , #Taille_blocY ,$1E88A8 )
Box (0,0, #Taille_blocX ,16,$518D5A)
StopDrawing ()
StartDrawing ( SpriteOutput (5))
Box (0,0, #Taille_blocX , #Taille_blocY , RGB (255, 0, 255))
StopDrawing ()
;Dessine le bloc d'avant plan
StartDrawing ( SpriteOutput (6))
Box (0,0, #Taille_blocX , #Taille_blocY , RGB (255, 0, 255))
For R = 1 To 10
DrawingMode (4) ; mode filaire
Circle ( #Taille_blocX /2, #Taille_blocY /2, #Taille_blocX /2, RGB (255/R,255/R,255/R))
Next R
StopDrawing ()
;******************************************************************************************
;Boucle principale
;******************************************************************************************
Repeat
ExamineKeyboard ()
ClearScreen (0,0,0)
;******************************************************************************************
;Affichage du niveau
For Y = 0 To #Taille_niveauY
For X = 0 To #Taille_niveauX
DisplayTransparentSprite ( Map_Couche_A(X,Y)\Bloc_Type , Map_Couche_A(X,Y)\X - (Scrolling_X/3) , Map_Couche_A(X,Y)\Y - (Scrolling_Y/3))
DisplayTransparentSprite ( Map_Couche_B(X,Y)\Bloc_Type , Map_Couche_A(X,Y)\X - (Scrolling_X/2) , Map_Couche_A(X,Y)\Y - (Scrolling_Y/2))
DisplayTransparentSprite ( Map_Couche_C(X,Y)\Bloc_Type , Map_Couche_A(X,Y)\X - Scrolling_X , Map_Couche_A(X,Y)\Y - Scrolling_Y)
Next : Next
;******************************************************************************************
;Gestion du scrooling
If KeyboardPushed ( #PB_Key_Left )
Scrolling_X-Scrolling_vitesse
EndIf
If KeyboardPushed ( #PB_Key_Right )
Scrolling_X+Scrolling_vitesse
EndIf
If KeyboardPushed ( #PB_Key_Down )
Scrolling_Y+Scrolling_vitesse
EndIf
If KeyboardPushed ( #PB_Key_Up )
Scrolling_Y-Scrolling_vitesse
EndIf
FlipBuffers ()
Until KeyboardPushed ( #PB_Key_Escape )
CloseScreen ()
End