Jeu : descendre les formes en fonction de cases vides

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Jeu : descendre les formes en fonction de cases vides

Message par blendman »

Salut

J'essaie de réaliser un petit jeu de type match3 (exemple de jeu connus utilisant ce principe : candyCrush).

J'ai réussi à faire le système de comparaison (match) pour voir si au moins 3 formes sont alignées en X ou en Y. Mais je ne sais pas trop comment faire ensuite pour faire redescendre les formes dans les cases devenues vides.

Auriez-vous une idée de la façon dont je pourrais m'y prendre pour faire ça ?

En gros, pour le moment, je mets les formes qui ont été "matchées" ( c'est-à-dire trouvées par 3 ou + en x ou en Y) en y = -96 Et ensuite, j'aimerai les faire redescendre et faire aussi descendre les formes dans le tableau en dessous desquelles il y a désormais une case vide, comme dans les jeux de match3 ^^.

Si vous avez une idée, même simplement une piste, merci beaucoup :)

voici le début de mon code :

Code : Tout sélectionner

#Window_main = 0


If InitSprite() =0 Or InitKeyboard()  =0
    End
EndIf

Global GlobX,GlobY,CaseVide,MaxShape,NbCase
GlobX = 100
GlobY = 50
MaxShape = 4
NbCase = 24


Structure tCase
	
	x.i 
	y.i 
	Vide.a 
	Colone.a
	Line.a
	OnY.a 
	
EndStructure
Global Dim Caz.tCase(NbCase) ; les cases vides 


Structure tCazFond
    x.i
    y.i
    sp.i
EndStructure
Global Dim CazBG.tCazFond(NbCase) 

Structure tShape
	
	Sort.i ; For sorting the Array
	
	Typ.a
	Sprite.i
	x.i 
	y.i
	
	CibleY.i 
	CibleOk.a 
		
	Selected.a 
	Line.a 

	; juste pour voir le n° du tableau
	TextId.a 
	
	
EndStructure
Global Dim Shape.tShape(NbCase)

Procedure SetSpriteImage(n,img)
    
    a = 1
    b= 94
	
    If StartDrawing(SpriteOutput(n))
	    
	    Select img
	            
	        Case 1
	            Box(a,a,b,b,RGB(255,0,0))
	            
	        Case 2
	            Box(a,a,b,b,RGB(0,255,0))
	            
	        Case 3
	            Box(a,a,b,b,RGB(255,255,0))
	            
	        Case 4
	            Box(a,a,b,b,RGB(0,255,255))
	            
	        Case 5
	            Box(a,a,b,b,RGB(0,0,255))
	            
	        Case 10
	            Box(a,a,b,b,RGB(150,150,150))
	            
	    EndSelect	    	    
	    StopDrawing()
	EndIf
    
EndProcedure


Procedure AddShape(nb,i)
    
	; le type de forme
        t = Random(MaxShape+1,1)
    
	Shape(i)\Sprite = CreateSprite(#PB_Any,96,96)
	n = Shape(i)\Sprite 
	
	SetSpriteImage(n,t)
		
	x = 96 * Mod(i,nb)
	y1 = i/nb
	y = 96 * y1
	Shape(i)\x = x
	Shape(i)\y = y
	
	Shape(i)\typ = t
	Shape(i)\Line = Shape(i)\y/96 
		
	CazBG(i)\sp = CreateSprite(#PB_Any,96,96)	
	SetSpriteImage(CazBG(i)\sp,10)
	CazBG(i)\x = x
	CazBG(i)\y = y
		
EndProcedure

Procedure ResetShape(i)
    
    Caz(i)\x = Shape(i)\x	
	Caz(i)\y = Shape(i)\y
	Caz(i)\Colone = Shape(i)\x/96
	Caz(i)\Line = Shape(i)\y/96
	
	If Caz(i)\OnY = 0
		Shape(i)\y = -96 
	Else
		Shape(i)\y = -96 * (1+Caz(i)\Line)	
	EndIf
		
	Shape(i)\y = -96 
		
	Shape(i)\CibleY = Shape(i)\y+96
	Shape(i)\CibleOk = 1
	
	Shape(i)\Typ = Random(MaxShape+1,1)	
	Shape(i)\Line = Shape(i)\y/96 
	
	SetSpriteImage(Shape(i)\Sprite,Shape(i)\Typ)
	    
EndProcedure



; Match
Procedure CheckMatch()

	; JE vérifie si on a 3 shape alignés en X
	For i=0 To ArraySize(shape())
		
		If i <= ArraySize(shape())-2
			
			If Shape(i)\y>=0
				
				If Shape(i)\x <=96*2
					
					ok3 = 0
					ok4 = 0
					t = Shape(i)\Typ
					
					If (Shape(i+1)\typ = t And Shape(i+2)\typ =t)
						If (Shape(i+1)\y >= 0 And Shape(i+2)\y >=0)
							Caz(i)\Vide = 1								
							Caz(i+1)\Vide = 1
							Caz(i+2)\Vide = 1
						
							bonus = 9
							If Shape(i)\x <=96
								If shape(i+3)\typ = t
									ok3 = 1
									bonus=bonus+4
									Caz(i+3)\Vide = 1
									If Shape(i)\x =0						
										If shape(i+4)\typ = t
											Caz(i+4)\Vide = 1
											bonus=bonus+5
											ok4 =1
										EndIf									
									EndIf									
								EndIf
							EndIf
							u=76
							
							CaseVide = 1			
						EndIf
					EndIf
				EndIf
			EndIf
		EndIf
	Next
	
	; puis on vérifie si on a 3 shapes au moins qui se suivent sur trois lignes .
	For i=0 To ArraySize(shape())
			
		If i < ArraySize(shape())-9
			
			If Shape(i)\y >=0
				
				If Shape(i)\y <=96*2
					
					ok3 = 0
					ok4 = 0
					t = Shape(i)\Typ
					
					a = 5
					
					If (Shape(i+a)\typ = t And Shape(i+2*a)\typ =t)
						If (Shape(i+a)\y >= 0 And Shape(i+2*a)\y >=0)
							Caz(i)\Vide = 1
							Caz(i)\OnY = 1
							Caz(i+a)\Vide = 1
							Caz(i+2*a)\Vide = 1
							
							Caz(i+a)\OnY = 1
							Caz(i+a*2)\OnY = 1
							
							bonus = 9
							If Shape(i)\y <=96 And i+3*a<=ArraySize(shape())
								If shape(i+3*a)\typ = t
									ok3 = 1
									bonus=bonus+4
									Caz(i+3*a)\vide = 1
									Caz(i+3*a)\OnY = 1
									If Shape(i)\y <=0 And i+4*a<=ArraySize(shape())					
										If shape(i+4*a)\typ = t
											bonus=bonus+5
											ok4 =1
											Caz(i+4*a)\vide = 1
											Caz(i+4*a)\OnY = 1
										EndIf									
									EndIf									
								EndIf
							EndIf
							u=76
																				
							CaseVide = 1
							
						EndIf
					EndIf
					
				EndIf
			EndIf				
		EndIf
		
	Next
EndProcedure

; fenêtre, screen, etc...
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
WinW =800
WinH =600
If OpenWindow(#Window_main,0,0,WinW,WinH, "Sprite", Flag) = 0
    End
EndIf 
If OpenWindowedScreen(WindowID(0), 0,0,WinW,WinH) = 0
    End
EndIf

; je crée les shapes & les cases du fond 
For i=0 To 24    
    AddShape(5,i)    
Next


Repeat
    
    Repeat
        
        EventID = WindowEvent()
        
        Select EventID
                
            Case #PB_Event_LeftClick
                ; on verifie si on clique sur 2 formes 
                x = WindowMouseX(0) - globX
                y = WindowMouseY(0) - globY
                If selected = 0
                    id = -1
                    For i=0 To 24
                        With shape(i)
                            If x>\x And x<=\x+96 And y>\y And y<\y+96
                                id = i 
                                Selected = 1
                                Break
                            EndIf
                        EndWith
                    Next                
                Else
                    id2 =-1
                    For i=0 To 24
                        With shape(i)
                            If x>\x And x<=\x+96 And y>\y And y<\y+96
                                id2 = i                                
                                Break
                            EndIf
                        EndWith
                    Next 
                    
                    If id2 > -1
                        
                        tt = Shape(id)\Typ
		        Shape(id)\Typ = Shape(id2)\Typ
			Shape(id2)\Typ = tt
		        SetSpriteImage(Shape(id)\sprite,Shape(id)\Typ)
			SetSpriteImage(Shape(id2)\sprite,Shape(id2)\Typ)
		    EndIf
                    Selected = 0
                EndIf
                
                
            Case #PB_Event_CloseWindow 
                End
                
        EndSelect
        
    Until event = 0
   
    ; on vérfie si on a pas 3 cases en X ou en Y qui se suivent à l'identique
    CheckMatch()
    
    ; on a des cases qui se suivent
    If caseVide = 1
        For j=0 To ArraySize(Caz())
            If caz(j)\Vide = 1
                ResetShape(j)
                caz(j)\Vide = 2												
            EndIf
        Next
    EndIf  
    
    ; puis, on affiche les cases
    ClearScreen(RGB(100,100,100))
    
    ; le fond
    For i=0 To ArraySize(CazBG())
        With CazBG(i)      
            DisplaySprite(\sp,\x+GlobX,\y+GlobY)
        EndWith        
    Next
    
    ; les formes
    For i=0 To ArraySize(shape())
        With shape(i)      
            DisplaySprite(\Sprite,\x+GlobX,\y+GlobY)
        EndWith        
    Next
     
    If StartDrawing(ScreenOutput())
        DrawText(0,0,Str(id)+"/"+Str(id2))
        StopDrawing()
    EndIf
        
    FlipBuffers()
    
Until Quit = 1

Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Jeu : descendre les formes en fonction de cases vides

Message par Micoute »

Je pense que c'est le même principe que tétris, tant qu'il n'y a rien au dessous, je descend d'une case, sinon j'ai perdu.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Jeu : descendre les formes en fonction de cases vides

Message par Ar-S »

Comme pour un casse brique, je créerai les levels via datasection en numérotant les cases par type de "bonbon"

Code : Tout sélectionner

datas.i 1,1,1,1,1,1 ; 1ere rangée de bonbons vert (1)
datas.i 2,2,0,1,1,1 ; 2eme rangée avec 2 bonbons bleu (2), une case vide (0), deux bonbon vert (1)
etc.. 
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Jeu : descendre les formes en fonction de cases vides

Message par blendman »

Micoute a écrit :Je pense que c'est le même principe que tétris, tant qu'il n'y a rien au dessous, je descend d'une case.
oui, mais comment savoir s'il y a quelque chose en dessous ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Jeu : descendre les formes en fonction de cases vides

Message par blendman »

Ar-S a écrit :Comme pour un casse brique, je créerai les levels via datasection en numérotant les cases par type de "bonbon"
En fait, le problème, ce n'est pas de créer les levels, c'est comment descendre convenablement ensuite les briques lorsque c'est nécessaire ^^.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Jeu : descendre les formes en fonction de cases vides

Message par comtois »

une piste éventuelle :

Dans ta structure ajoute un champ 'demande déplacement' , ce champ est activé par la case vide.
Exemple tu as une case vide en x = 5 et y = 3 , cette case met à 1 le champ 'demande déplacement' de la case x=5 et y = 2 qui elle même met à 1 le champ 'demande déplacement' de la case x=5 et y = 1
en Clair une boucle à partir d'une case vide
For y = yDeLaCaseVide to 0 step -1
Case(XDeLaCaseVide, y)\DemandeDeplacement = 1
Next y

Tu peux aussi faire la demande déplacement que pour la case qui se trouve au dessus de la case vide. En gros ça consiste à descendre case par case.
Exemple tu as une case vide en x = 5 et y = 3 , cette case met à 1 le champ 'demande déplacement' de la case x=5 et y = 2
Quand la case en x =5 et y = 2 sera descendue en X=5 et y = 3, la case x=5 et y = 2 sera vide, elle mettra donc à 1 la case en x = 5 et y=1
Et ainsi de suite

Et dans une procédure Animation tu testes si DemandeDeplacement = 1 pour bouger tes trucs.

ça demande à être testé et adapté si nécessaire, c'est une première idée !
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Jeu : descendre les formes en fonction de cases vides

Message par blendman »

Merci pour les pistes et les réponses.

Pour le moment, j'ai testé ça et ça fonctionne, mais uniquement pour les formes dont le y<0 (autrement, les cases qui deviennent vides).
Je ne comprends pas encore pourquoi toutes les cases ne descendent pas...

Code : Tout sélectionner

#Window_main = 0


If InitSprite() =0 Or InitKeyboard()  =0
    End
EndIf

Global GlobX,GlobY,CaseVide,MaxShape,NbCase
GlobX = 350
GlobY = 250
MaxShape = 4
NbCase = 24


Structure tCase
	
	x.i 
	y.i 
	Vide.a 
	Colone.a
	Line.a
	OnY.a 
	
EndStructure
Global Dim Caz.tCase(NbCase) ; les cases vides 


Structure tCazFond
    x.i
    y.i
    sp.i
EndStructure
Global Dim CazBG.tCazFond(NbCase) 

Structure tShape
	
	Sort.i ; For sorting the Array
	
	Typ.a
	Sprite.i
	x.i 
	y.i
	
	CibleY.i 
	CibleOk.a 
		
	Selected.a 
	Line.a 

	
; 	Colone.a
; 	
; 	ColoneCible.a 
; 	LineCible.a 
	; juste pour voir le n° du tableau
	TextId.a 
	
	
EndStructure
Global Dim Shape.tShape(NbCase)


Procedure SetSpriteImage(n,img)
    
    a = 1
	b= 94
	
    If StartDrawing(SpriteOutput(n))
	    
	    Select img
	            
	        Case 1
	            Box(a,a,b,b,RGB(255,0,0))
	            
	        Case 2
	            Box(a,a,b,b,RGB(0,255,0))
	            
	        Case 3
	            Box(a,a,b,b,RGB(255,255,0))
	            
	        Case 4
	            Box(a,a,b,b,RGB(0,255,255))
	            
	        Case 5
	            Box(a,a,b,b,RGB(0,0,255))
	            
	        Case 10
	            Box(a,a,b,b,RGB(150,150,150))
	            
	    EndSelect
	    
	    
	    StopDrawing()
	EndIf
    
EndProcedure




Procedure AddShape(nb,i)
    
	; le type de forme
    t = Random(MaxShape+1,1)
    
	Shape(i)\Sprite = CreateSprite(#PB_Any,96,96)
	n = Shape(i)\Sprite 
	
	SetSpriteImage(n,t)
	
	
	
	x = 96 * Mod(i,nb)
	y1 = i/nb
	y = 96 * y1
	Shape(i)\x = x
	Shape(i)\y = y
	
	Shape(i)\typ = t
	Shape(i)\Line = Shape(i)\y/96 
	
	
	CazBG(i)\sp = CreateSprite(#PB_Any,96,96)	
	SetSpriteImage(CazBG(i)\sp,10)
	CazBG(i)\x = x
	CazBG(i)\y = y

	
	
EndProcedure

Procedure ResetShape(i)
    
    Caz(i)\x = Shape(i)\x	
	Caz(i)\y = Shape(i)\y
	Caz(i)\Colone = Shape(i)\x/96
	Caz(i)\Line = Shape(i)\y/96
	
	If Caz(i)\OnY = 0
	    Shape(i)\y = -96
	    Shape(i)\CibleY = 0
	Else
	    Shape(i)\y = -96 * (1+Caz(i)\Line)
	    Shape(i)\CibleY = Caz(i)\y
	EndIf
	
	
	; Shape(i)\CibleY = Shape(i)\y+96
	
	Shape(i)\CibleOk = 1
	
	Shape(i)\Typ = Random(MaxShape+1,1)	
	Shape(i)\Line = Shape(i)\y/96 
	
	
	SetSpriteImage(Shape(i)\Sprite,Shape(i)\Typ)
    
    
EndProcedure



; Match
Procedure CheckMatch()

	; JE vérifie si on a 3 shape alignés en X
	For i=0 To ArraySize(shape())
		
		If i <= ArraySize(shape())-2
			
			If Shape(i)\y>=0
				
				If Shape(i)\x <=96*2
					
					ok3 = 0
					ok4 = 0
					t = Shape(i)\Typ
					
					If (Shape(i+1)\typ = t And Shape(i+2)\typ =t)
						If (Shape(i+1)\y >= 0 And Shape(i+2)\y >=0)
							Caz(i)\Vide = 1								
							Caz(i+1)\Vide = 1
							Caz(i+2)\Vide = 1
							
; 							If i>=5
;     							Shape(i-5)\CibleOk = 1
;     							Shape(i-4)\CibleOk = 1
;     							Shape(i-3)\CibleOk = 1    							
; 							EndIf
							
							bonus = 9
							If Shape(i)\x <=96
							    If shape(i+3)\typ = t
; 							        If i>=5
; 							            Shape(i-2)\CibleOk = 1
; 							        EndIf
							        
									ok3 = 1
									bonus=bonus+4
									Caz(i+3)\Vide = 1
									If Shape(i)\x =0						
									    If shape(i+4)\typ = t
; 									        If i>=5
;         							            Shape(i-1)\CibleOk = 1
;         							        EndIf
											Caz(i+4)\Vide = 1
											bonus=bonus+5
											ok4 =1
										EndIf									
									EndIf									
								EndIf
							EndIf
							u=76
							
							;SetScore(Bonus)
							
							CaseVide = 1			
						EndIf
					EndIf
				EndIf
			EndIf
		EndIf
	Next
	
	; puis on vérifie si on a 3 shapes au moins qui se suivent sur trois lignes .
	For i=0 To ArraySize(shape())
			
		If i < ArraySize(shape())-9
			
			If Shape(i)\y >=0
				
				If Shape(i)\y <=96*2
					
					ok3 = 0
					ok4 = 0
					t = Shape(i)\Typ
					
					a = 5
					
					If (Shape(i+a)\typ = t And Shape(i+2*a)\typ =t)
						If (Shape(i+a)\y >= 0 And Shape(i+2*a)\y >=0)
							Caz(i)\Vide = 1
							Caz(i)\OnY = 1
							Caz(i+a)\Vide = 1
							Caz(i+2*a)\Vide = 1
							
							Caz(i+a)\OnY = 1
							Caz(i+a*2)\OnY = 1
							
							bonus = 9
							If Shape(i)\y <=96 And i+3*a<=ArraySize(shape())
								If shape(i+3*a)\typ = t
									ok3 = 1
									bonus=bonus+4
									Caz(i+3*a)\vide = 1
									Caz(i+3*a)\OnY = 1
									If Shape(i)\y <=0 And i+4*a<=ArraySize(shape())					
										If shape(i+4*a)\typ = t
											bonus=bonus+5
											ok4 =1
											Caz(i+4*a)\vide = 1
											Caz(i+4*a)\OnY = 1
										EndIf									
									EndIf									
								EndIf
							EndIf
							u=76
							
							; on augmente le score 
							;SetScore(Bonus)
							CaseVide = 1
							
						EndIf
					EndIf
					
				EndIf
			EndIf				
		EndIf
		
	Next
	



EndProcedure





; fenêtre, screen, etc...

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
WinW = 1200
WinH = 800
If OpenWindow(#Window_main,0,0,WinW,WinH, "Sprite", Flag) = 0
    End
EndIf 
If OpenWindowedScreen(WindowID(0), 0,0,WinW,WinH) = 0
    End
EndIf

; je crée les shapes & les cases du fond 
For i=0 To 24
    
    AddShape(5,i)
    
Next

speed = 4

Delay(2000)

Repeat
    
   
    
    
    Repeat
        
        EventID     = WindowEvent()
        
        Select EventID
                
            Case #PB_Event_LeftClick
                ;If casevide = 0
                    
                    ; on verifie si on clique sur 2 formes 
                    x = WindowMouseX(0) - globX
                    y = WindowMouseY(0) - globY
                    If selected = 0
                        id = -1
                        For i=0 To 24
                            With shape(i)
                                If x>\x And x<=\x+96 And y>\y And y<\y+96
                                    id = i 
                                    Selected = 1
                                    Break
                                EndIf
                            EndWith
                        Next                
                    Else
                        id2 =-1
                        For i=0 To 24
                            With shape(i)
                                If x>\x And x<=\x+96 And y>\y And y<\y+96
                                    id2 = i                                
                                    Break
                                EndIf
                            EndWith
                        Next 
                        
                        If id2 > -1
                            
                            tt = Shape(id)\Typ
                            Shape(id)\Typ = Shape(id2)\Typ
                            Shape(id2)\Typ = tt
                            
                            SetSpriteImage(Shape(id)\sprite,Shape(id)\Typ)
                            SetSpriteImage(Shape(id2)\sprite,Shape(id2)\Typ)
                            
                        EndIf
                        Selected = 0
                    EndIf
                    
                ;EndIf
                
            Case #PB_Event_CloseWindow 
                End
                
        EndSelect
        
    Until event = 0
   
    ; on vérfie si on a pas 3 cases en X ou en Y qui se suivent à l'identique
    ;If caseVide = 0
        
        CheckMatch()
    
    
    ;Else
        If caseVide = 1
        
        ; on a des cases qui se suivent
        
        ; d'abord, je vérifie les cases vides et j'enlève les formes
        For j=0 To ArraySize(Caz())-1
            
            If caz(j)\Vide = 1
               
                
                ; on vérfie pour chque shape s'il n'est pas au dessus d'une case vide, si oui, il devra descendre de la différence)
                For i= 0 To ArraySize(Shape())-1
                    
                    If i =j
                        ; le shape est sur une case vide, on le vire en haut et il redescendra ensuite
                        ResetShape(j)
                    Else
                        ; on vérifie si le shape est au-dessus d'une case vide ou non.
                        ;If caz(j)\Vide = 1
                            If shape(i)\y < caz(j)\y And shape(i)\x = caz(j)\x
                                
                                shape(i)\CibleOk = 2
                                
;                                 If caz(j)\OnY =0 ; c'est une case alignée en X
;                                     shape(i)\CibleY = shape(i)\y +96
;                                 Else                                
;                                     shape(i)\CibleY = caz(j)\y 
;                                     caz(j)\Vide = 2
;                                 EndIf
                            EndIf
                        ;EndIf
                    EndIf
                Next
                caz(j)\Vide = 2												
            EndIf
            Casevide =2
        Next
        
        
       
        
        
    ElseIf CaseVide = 2   
        
        ; puis, je fais redescendre les formes , y compris celles des cases au-dessus des cases vides
        
        CaseVide = 3
        
        For i= ArraySize(Shape())  To 0 Step -1
            
            ok = 0
            
            If shape(i)\CibleOk =2
                
                ; on va vérifier pour chaque case en dessous s'il y a quelque chose.
                
                For j=0 To ArraySize(shape())
                    
                    If i <> j
                        
                        If caz(j)\Vide = 0 ; la case ne doit pas être vide.
                            
                            If shape(j)\x = shape(i)\x 
                                
                                ; on vérifie si le y du shape du dessous est toujours 
                                If shape(i)\y+96 >= shape(j)\Y ;And shape(i)\y<=shape(j)\Y+96            
                                    
                                    shape(i)\CibleOk=0
                                    Debug Str(i)+"/"+Str(j)
                                    ok = 1                                
                                    ; caz(i)\vide = 0
                                    Break
                                EndIf
                           
                            EndIf
                        
                        EndIf
                       
                    EndIf
                    
                Next
                
                If ok = 0
                   
                    CaseVide = 2
                    shape(i)\y + speed 
                    
                EndIf
                
            ElseIf shape(i)\CibleOk =1
                
                ; si y<0, on descend de toute façons, sinon, on passe au 2ème mode de descente (en verifiant en dessous
                If shape(i)\y < 0
                    
                    CaseVide = 2
                    shape(i)\y + speed     
                    
                Else
                    shape(i)\CibleOk =2
                EndIf
                
                
                
                
            EndIf             
        Next
        
    ElseIf caseVide = 3
        ; enfin, je trie le tableau car toutes les cases sont revenues à leur place
        
       		
			caseVide = 0
			For i= 0 To ArraySize(shape())
				y1 = Shape(i)\y
				y1 = y1/96
				Shape(i)\y = y1 * 96				
				Shape(i)\sort = (Shape(i)\x/95) + (Shape(i)\y/95)*5
			Next
			;SortStructuredArray(shape(),#PB_Sort_Ascending ,OffsetOf(tShape\Sort),TypeOf(tShape\Sort))
			; puis, on remet LES cases vides à zéro
			For j =0 To ArraySize(Caz())-1
				caz(j)\Vide = 0
				Caz(j)\OnY = 0
			Next
		
    EndIf
    
    
    
    
    
    ;{ Affichage
    ; puis, on affiche les cases
    ClearScreen(RGB(100,100,100))
    
    ; le fond
    For i=0 To ArraySize(CazBG())
        With CazBG(i)      
            DisplaySprite(\sp,\x+GlobX,\y+GlobY)
        EndWith        
    Next
    
    ; les formes
    For i=0 To ArraySize(shape())
        With shape(i)      
            DisplaySprite(\Sprite,\x+GlobX,\y+GlobY)
        EndWith        
    Next
     
    If StartDrawing(ScreenOutput())
        
        For i=0 To ArraySize(shape())
            With shape(i)
                DrawText(\x+GlobX+30,\y+GlobY+30,Str(i)+"/"+Str(\Sort))                
            EndWith        
        Next
        
        DrawText(0,0,Str(id)+"/"+Str(id2))
        StopDrawing()
    EndIf
    
    
    FlipBuffers()
    ;}
    
    
Until Quit = 1

Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Jeu : descendre les formes en fonction de cases vides

Message par microdevweb »

Voila avec un genre de gravité, pour testé clique sur le bleu ou le carré rouge

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()

Structure mBox
    X.i
    Y.i
    idSprite.i
    VeloY.i
EndStructure
Global NewList myBox.mBox()
Global WF=800,HF=600,BoxSize=100,cursorSize=24
Global X=(WF/2)-(BoxSize/2) ; au centre
Global Y=(HF)-BoxSize       ; on commence en bas

; Création de la fenêtre de jeu
OpenWindow(0,0,0,WF,HF,"Teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,WF,HF)

; Création de 3 box
Define N
; Tableau pour 3 couleurs
Dim Color(2)
Color(0)=RGB(255, 0, 0) ; Rouge
Color(1)=RGB(0, 0, 255) ; bleu
Color(2)=RGB(255, 255, 0) ;jaune
For N=0 To 2
    CreateSprite(N,BoxSize,BoxSize)
    ; Dessin du sprite
    StartDrawing(SpriteOutput(N))
    Box(0,0,BoxSize,BoxSize,Color(N))
    StopDrawing()
    ; Ajout du sprite à la structure
    AddElement(myBox())
    With myBox()
        \idSprite=N
        \VeloY=0 ; pas de vélocioté pour commencer
        \X=X
        \Y=Y
        Y-BoxSize ; Remonté le prochaine sprite
    EndWith
Next
; Création d'un carré blanc qui va servir de curseur
CreateSprite(3,cursorSize,cursorSize)
StartDrawing(SpriteOutput(3))
Box(0,0,cursorSize,cursorSize,RGB(255, 255, 255))
StopDrawing()


Procedure DisplayBox()
    ForEach myBox()
        With myBox()
            ; descent le box si il y à une vélocité
            If \Y+\VeloY+BoxSize<HF
                \Y=\Y+\VeloY
            EndIf
            DisplaySprite(\idSprite,\X,\Y)
        EndWith
    Next
EndProcedure
Procedure TestingBoxDestroy()
    ForEach myBox()
        With myBox()
            If SpriteCollision(3,MouseX(),MouseY(),\idSprite,\X,\Y)
                DeleteElement(myBox())
            EndIf
        EndWith
    Next
EndProcedure
Procedure Gavity()
    Protected Y,HoverGround.b=#False,*Id
    ForEach myBox()
        With myBox()
            Y=\Y+BoxSize+1 ; Ajoute un pixel pour le teste
            PushListPosition(myBox()) ; mémorise la position de la liste
            *Id=@myBox()
            HoverGround=#False ; par défuat on ne repose sur rien
            ForEach myBox()
                ; Le teste ne se fera que sur les box différent de celui testé
                If Y>=\Y And *Id<>@myBox()
                    HoverGround=#True ; on repose sur un box
                    Break
                EndIf
            Next
            PopListPosition(myBox()) ; revien à la position  de la liste
                                     ; Si on ne repose sur rien on ajoute une velocité
            If Not HoverGround
                \VeloY=3
            Else
                \VeloY=0
            EndIf
        EndWith
    Next
EndProcedure

Global Event
; Main Loop
Repeat 
    Repeat
        Event=WindowEvent()
        If Event=#PB_Event_CloseWindow
            End
        EndIf
    Until  Event=0 
    ClearScreen(0)
    ; Affichage des Box
    DisplayBox()
    ExamineMouse()
    ; Position le carré blanc à la position de la souris
    DisplaySprite(3,MouseX(),MouseY())
    ; Si teste si on doit destruire le box (clic souris)
    If MouseButton(#PB_MouseButton_Left)
        TestingBoxDestroy()
    EndIf
    Gavity()
    ; Gestion de la sortie de jeu par Esc
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Escape)
        End
    EndIf
    FlipBuffers()
ForEver

Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre