Jeu et petit moteur de Particule

Programmation avancée de jeux en PureBasic
foossile
Messages : 25
Inscription : sam. 15/juil./2006 11:35

Message par foossile »

Cpl.Bator a écrit :Moi perso , je gère le scrolling de cette maniere :

- Tile d'une taille prédefinie (32x32,64x64,...)
- Ensuite pour un gain de perf, tu testes le tile si il est dans l'écran pour l'afficher, ca marche très bien.

- pour l'affichage, tu affiches tout les sprite avec une variable commune pour gerer le scrolling.

SpriteX - ScroolX, SpriteY-ScroolY

et lorsque tu veut faire défiler le décor, alors tu modifies juste ScroolX ou Y

@++
Peux-t-on avoir un exemple de code ?
Thx :)
Anonyme

Message par Anonyme »

Code : Tout sélectionner


;********************* 
;*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,RGB(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 (RGB(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 

++ :wink:
Répondre