[Tut] 2D mario-like / scrolling & affichage multicouche

Programmation avancée de jeux en PureBasic
Anonyme

[Tut] 2D mario-like / scrolling & affichage multicouche

Message par Anonyme »

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 :mad:

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