ne faite pas cuire d'oeuf le matin !!

Programmation avancée de jeux en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

ne faite pas cuire d'oeuf le matin !!

Message par Backup »

ce matin en me levant, j'ai voulu faire des oeufs au plat ..
j'arrive vers ma gaziniere ,et la l'oeuf m'a échapé des mains !!
il etait tres gluant ! il voulais absolument couler par terre
heureusement ma gaziniere est pourvu de dispositif special
la preuve : :D

2 touches Shift et Espace // fleche du bas pour remettre l'oeuf :)

Code : Tout sélectionner

; realisé par Dobro en pure v 3.93
; mis en version purebasic 5.22

;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(chaine$)
;*******************************************************************************************************
;- test du materiel
;*******************************************************************************************************
If InitSprite ()=0
	msg_erreur( "impossible d'initialiser les sprites" + Chr (10)+ " le prg va quitter " )
	End
EndIf
If InitMouse ()=0
	msg_erreur( "impossible d'initialiser la souris" + Chr (10)+ " le prg va quitter " )
	End
EndIf

If InitKeyboard ()=0
	msg_erreur( "impossible d'initialiser le clavier" + Chr (10)+ " le prg va quitter " )
	End
EndIf
If InitJoystick()=0
	msg_erreur( "impossible d'initialiser le joystick" + Chr (10)+ " on va continuer sans " )
	joystick=0
	Else
	joystick=1 ; le joystick est present !!²
EndIf

InitSprite()
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
	#joystick
	#window
	#Sprite
	#flip_gauche
	#flip_droit
	#bumper
	
	#balle
	
	#top
	#topgauche
	#topdroit
	#gauche
	#droit
	#basgauche
	#basdroit
	
	#feu
	#feu2
	
	
EndEnumeration
Structure balle
	x.w
	y.w
	sensx.f
	sensy.f
EndStructure
nbr_balle=0
Dim balle.balle(1) ; on cree 1 instance de balle

Structure flip
	x.w
	y.w
EndStructure
Dim flip.flip(1) ; 0 et 1

Structure bumper
	x.w
	y.w
EndStructure
Dim bumper.bumper(10) ; 0 a 3

Structure top
	x.w
	y.w
EndStructure

Structure feu
	x.w
	y.w
EndStructure
Dim feu.feu(10)

Structure feu1
	x.w
	y.w
EndStructure
Dim feu1.feu1(2)

Structure feu2
	x.w
	y.w
EndStructure
Dim feu2.feu2(2)

Structure feu3
	x.w
	y.w
EndStructure
Dim feu3.feu3(2)
Dim top.top(10) ; 0 et 1
; affecte des coordonees aleatoire et place les balles
xd=520
yd=150

balle(0)\x=xd ; placement de la balle
balle(0)\y=yd
balle(0)\sensx=1 ; determine le sens de deplacement de la balle et la vitesse
balle(0)\sensy=1
flip(0)\x=350
flip(0)\y=454
flip(1)\x=546
flip(1)\y=454
bumper(0)\x=300
bumper(0)\y=100
bumper(1)\x=600
bumper(1)\y=100
bumper(2)\x=300
bumper(2)\y=300
bumper(3)\x=600
bumper(3)\y=300
top(0)\x=200 ; haut
top(0)\y=50
top(1)\x=200 ; gauche
top(1)\y=50
top(2)\x=800 ; droit
top(2)\y=50
top(3)\x=200 ; basgauche
top(3)\y=500
top(4)\x=675 ; basdroit
top(4)\y=500
feu(0)\x=bumper(0)\x
feu(0)\y=bumper(0)\y
feu(1)\x=bumper(1)\x
feu(1)\y=bumper(1)\y
feu(2)\x=bumper(2)\x
feu(2)\y=bumper(2)\y
feu(3)\x=bumper(3)\x
feu(3)\y=bumper(3)\y
;*******************************************************************************************************
;-ouvre ecran
;*******************************************************************************************************
OpenWindow(#window,10,1,1024,600,"Gaziniere a Dobro",#PB_Window_SystemMenu)
OpenWindowedScreen (WindowID(#window),1,1,1024, 600, 1,1,1 )
KeyboardMode (1)
;*******************************************************************************************************
;-creation des sprites
;*******************************************************************************************************
coul=coul+10
sprite=sprite
aa= CreateSprite ( #balle ,32,32, #PB_Sprite_PixelCollision ) ; on cree un sprite (une balle)
StartDrawing ( SpriteOutput ( #balle ) ) ; on va dessiner dans le sprite
	Circle (16, 16, 16, RGB ($FF,$FF,$FF)) ; on dessine un rond BLANC dedans(dans le sprite)
	Circle (16, 16, 8, RGB ($FC,$FF,$84))
StopDrawing ()

ac= CreateSprite ( #flip_gauche ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #flip_gauche ) ) ; on va dessiner dans le sprite
	Circle (16, 64, 16, RGB ($F1,0,$F))
	LineXY (16, 64-16, 128, 64, RGB ($F1,0,$F))
	LineXY (16, 64+16, 128, 64, RGB ($F1,0,$F))
	FillArea (40, 66, RGB ($F1,0,$F), RGB ($F1,0,$F))
	; Plot(40,66,RGB($FF,$FF,$F))
StopDrawing ()

ae= CreateSprite ( #flip_droit ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #flip_droit ) ) ; on va dessiner dans le sprite
	Circle (128-16, 64, 16, RGB ($F1,0,$F))
	LineXY (128-16, 64-16, 0, 64, RGB ($F1,0,$F))
	LineXY (128-16, 64+16, 0, 64, RGB ($F1,0,$F))
	FillArea (80, 66, RGB ($F1,0,$F), RGB ($F1,0,$F))
	;Plot(80,66,RGB($FF,$FF,$F))
StopDrawing ()

ag= CreateSprite ( #bumper ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #bumper ))
	For i=64 To 1 Step-10
		Circle (128/2, 128/2, i , RGB (10,i*2,i*2))
	Next i
StopDrawing ()

ai= CreateSprite ( #top ,600,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #top ))
	Box (0, 0, 600, 32, RGB ($FC,$F4,$65))
	BackColor (RGB(0, 0 ,0))
	FrontColor (RGB(0,0,0))
	DrawingMode (1)
	DrawText (280,8, "La gaziniere a Dobro" )
StopDrawing ()

CreateSprite ( #gauche ,32,600, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #gauche ))
	Box (0, 0, 32, 600, RGB ($FC,$14,$65))
StopDrawing ()
CreateSprite ( #droit ,32,600, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #droit ))
	Box (0, 0, 32, 600, RGB ($FC,$14,$65))
StopDrawing ()
CreateSprite ( #basgauche ,150,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #basgauche ))
	Box (0, 0, 150, 32, RGB ($FC,$F4,$65))
StopDrawing ()
CreateSprite ( #basdroit ,155,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #basdroit ))
	Box (0, 0, 155, 32, RGB ($FC,$F4,$65))
StopDrawing ()
CreateSprite ( #feu ,110,110, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #feu ))
	Box (0, 0, 150, 150, RGB ($FF,$0,$0))
StopDrawing ()
CreateSprite ( #feu2 ,110,110, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #feu2 ))
	Box (0, 0, 150, 150, RGB ($FF,$F9,$0))
StopDrawing ()

RotateSprite( #feu ,30,#PB_Relative)
RotateSprite( #feu2 ,-30,#PB_Relative)
; ZoomSprite3D(#bumper3d, 64, 64)
;*******************************************************************************************************
;-boucle principale
Repeat
	
	;- examine le materiel
	;*******************************************************************************************************
	ExamineKeyboard ()
	KeyboardMode (1)
	ExamineMouse ()
	If joystick=1
		ExamineJoystick (#joystick) ; optionel on examine seulement si present !!
	EndIf
	
	;*******************************************************************************************************
	; serie de gosub ou appel de procedure a mettre ici
	;*******************************************************************************************************
	Gosub dessin_sur_ecran ; trace une ligne sur l'ecran et une serie de cercles
	Gosub calcul_des_rebonds
	Gosub apesanteur
	Gosub avance_la_balle
	;*******************************************************************************************************
	;{ interroge le clavier et joystick
	;- interoge le clavier
	
	
	If  KeyboardPushed(#PB_Key_RightShift )
		RotateSprite ( #flip_droit , 30,0) 
		right=1
		Else
		RotateSprite ( #flip_droit , 0, 0) 
		right=0
	EndIf 
	
	If  KeyboardPushed(#PB_Key_LeftShift )
		RotateSprite ( #flip_gauche , -30, 0) 
		left=1
		Else
		RotateSprite ( #flip_gauche ,0, 0) 
		left=0
	EndIf
	If perdu.b=1 Or balle(0)\sensx=0 And balle(0)\sensy=0
		If   KeyboardPushed(#PB_Key_Down )
			xd=520
			yd=150
			balle(0)\x=xd ; placement de la balle
			balle(0)\y=yd
			balle(0)\sensx=1 ; determine le sens de deplacement de la balle et la vitesse
			balle(0)\sensy=1
			point=0
		EndIf
	EndIf
	If KeyboardPushed(#PB_Key_Space ) ; massage 
		balle(0)\sensx=balle(0)\sensx-0.04
		top(0)\x=200-5 ; haut
		top(1)\x=200-5 ; gauche
		top(2)\x=800 -5 ; droit
		top(3)\x=200-5 ; basgauche
		top(4)\x=675 -5 ; basdroit
		bumper(0)\x=300-5
		bumper(1)\x=600-5
		bumper(2)\x=300-5
		bumper(3)\x=600-5
		Else
		top(0)\x=200 ; haut
		top(1)\x=200 ; gauche
		top(2)\x=800 ; droit
		top(3)\x=200 ; basgauche
		top(4)\x=675 ; basdroit
		bumper(0)\x=300
		bumper(1)\x=600
		bumper(2)\x=300
		bumper(3)\x=600
	EndIf
	
	
	;}
	If balle(0)\sensy<-12
		balle(0)\sensy=-8
	EndIf
	If balle(0)\sensx<-8
		balle(0)\sensx=-6
	EndIf
	If balle(0)\sensx>8
		balle(0)\sensx=6
	EndIf
	
	
	
	
	;{affichage des sprites
	;-affichage des sprites
	;*******************************************************************************************************
	;Start ()
	DisplaySprite ( #flip_gauche ,flip(0)\x, flip(0)\y)
	DisplaySprite ( #flip_droit ,flip(1)\x, flip(1)\y)
	DisplaySprite ( #bumper ,bumper(0)\x, bumper(0)\y)
	DisplaySprite ( #bumper ,bumper(1)\x, bumper(1)\y)
	DisplaySprite ( #bumper ,bumper(2)\x, bumper(2)\y)
	DisplaySprite ( #bumper ,bumper(3)\x, bumper(3)\y)
	DisplaySprite ( #balle , balle(0)\x,balle(0)\y)
	DisplaySprite ( #top , top(0)\x,top(0)\y)
	DisplaySprite ( #gauche , top(1)\x,top(1)\y)
	DisplaySprite ( #droit ,top(2)\x,top(2)\y)
	DisplaySprite ( #basgauche , top(3)\x,top(3)\y)
	DisplaySprite ( #basdroit , top(4)\x,top(4)\y)
	; balle(0)\x=MouseX()
	; balle(0)\y=MouseY() ;
	; DisplaySprite3D( #balle3d, balle(0)\x, balle(0)\y)
	;Stop ()
	;*******************************************************************************************************
	;} 
	
	FlipBuffers () ; affiche le resultat a l'ecran !  
	
	ClearScreen (RGB(0,0,0)) ; nettoie l'ecran apres affichage
Until KeyboardPushed ( #PB_Key_Escape ) Or MouseButton (2)
End

;{ ********* Zone des sous-programme ******************
;{ dessin_sur_ecran
;- dessin_sur_ecran
dessin_sur_ecran: 
StartDrawing ( ScreenOutput ())
	BackColor (RGB(0, 0 ,0))
	FrontColor (RGB($3A,$AB,$81))
	DrawText (10,10, "shiftgauche-et-droit pour les flips espace pour masser et fleche-bas pour relancer " )
	DrawText (50,50," points :" + Str (point))
StopDrawing ()
Return
;}

;{calcul_des_rebonds
;-calcul_des_rebonds
calcul_des_rebonds:
; collision flip gauche
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_gauche ,flip(0)\x, flip(0)\y)<>0 And left=1
	balle(0)\sensy=- balle(0)\sensy-6
	balle(0)\sensx=- balle(0)\sensx-4
	ElseIf SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_gauche ,flip(0)\x, flip(0)\y)<>0 And left=0
	balle(0)\sensy=- balle(0)\sensy+0.08
EndIf
; collision flip droit
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_droit ,flip(1)\x, flip(1)\y)<>0 And right=1
	balle(0)\sensy=-balle(0)\sensy-6
	balle(0)\sensx=-balle(0)\sensx-4
	If balle(0)\sensy<-12
		balle(0)\sensy=-8
	EndIf
	ElseIf SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_droit ,flip(1)\x, flip(1)\y)<>0 And right=0
	balle(0)\sensy=-balle(0)\sensy+0.08
EndIf

; collision bumpers
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(0)\x, bumper(0)\y)<>0
	If balle(0)\x<=bumper(0)\x Or balle(0)\x>=bumper(0)\x+64
		balle(0)\sensx=-balle(0)\sensx
	EndIf
	If balle(0)\y<=bumper(0)\y Or balle(0)\y>=bumper(0)\y+64
		balle(0)\sensy=-balle(0)\sensy
	EndIf
	;Start ()
	DisplaytransparentSprite ( #feu , feu(0)\x+10,feu(0)\y+10)
	DisplaytransparentSprite ( #feu2 , feu(0)\x+10,feu(0)\y+10)
	;Stop ()
	point=point+10
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(1)\x, bumper(1)\y)<>0
	If balle(0)\x<=bumper(1)\x Or balle(0)\x>=bumper(1)\x+64
		balle(0)\sensx=-balle(0)\sensx
	EndIf
	If balle(0)\y<=bumper(1)\y Or balle(0)\y>=bumper(1)\y+64
		balle(0)\sensy=-balle(0)\sensy
	EndIf
	;Start ()
	DisplaytransparentSprite ( #feu , feu(1)\x+10,feu(1)\y+10)
	DisplaytransparentSprite ( #feu2 , feu(1)\x+10,feu(1)\y+10)
	;Stop ()
	point=point+10
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(2)\x, bumper(2)\y)<>0
	If balle(0)\x<=bumper(2)\x Or balle(0)\x>=bumper(2)\x+64
		balle(0)\sensx=-balle(0)\sensx
	EndIf
	If balle(0)\y<=bumper(2)\y Or balle(0)\y>=bumper(2)\y+64
		balle(0)\sensy=-balle(0)\sensy
	EndIf
	;Start ()
	DisplaytransparentSprite ( #feu , feu(2)\x+10,feu(2)\y+10)
	DisplaytransparentSprite ( #feu2, feu(2)\x+10,feu(2)\y+10)
	;Stop (
	point=point+10
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(3)\x, bumper(3)\y)<>0
	If balle(0)\x<=bumper(3)\x Or balle(0)\x>=bumper(3)\x+64
		balle(0)\sensx=-balle(0)\sensx
	EndIf
	If balle(0)\y<=bumper(3)\y Or balle(0)\y>=bumper(3)\y+64
		balle(0)\sensy=-balle(0)\sensy
	EndIf
	;Start ()
	DisplaytransparentSprite ( #feu , feu(3)\x+10,feu(3)\y+10)
	DisplaytransparentSprite ( #feu2 , feu(3)\x+10,feu(3)\y+10)
	;Stop ()
	point=point+10
EndIf
;************************ collision avec le decor ! *************************************************

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #top ,top(0)\x, top(0)\y)<>0
	balle(0)\sensy=-balle(0)\sensy
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #gauche ,top(1)\x, top(1)\y)<>0
	balle(0)\sensx=-balle(0)\sensx
	If balle(0)\sensx>0
		balle(0)\sensx=balle(0)\sensx-0.2
	EndIf
	If balle(0)\sensx<0
		balle(0)\sensx=-balle(0)\sensx-0.4
	EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #droit ,top(2)\x, top(2)\y)<>0
	balle(0)\sensx=-balle(0)\sensx
	If balle(0)\sensx>0
		balle(0)\sensx=balle(0)\sensx-0.2
		If balle(0)\sensx=0
			balle(0)\sensx=0
		EndIf
	EndIf
	If balle(0)\sensx<0
		balle(0)\sensx=balle(0)\sensx-0.2
		If balle(0)\sensx=0
			balle(0)\sensx=0
		EndIf
		
	EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #basgauche ,top(3)\x, top(3)\y)<>0
	balle(0)\sensy=-balle(0)\sensy
	If balle(0)\sensy<=0
		balle(0)\sensy=balle(0)\sensy+0.08
	EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #basdroit ,top(4)\x, top(4)\y)<>0
	balle(0)\sensy=-balle(0)\sensy
	If balle(0)\sensy<=0
		balle(0)\sensy=balle(0)\sensy+0.08
	EndIf
EndIf
; ***********************
Return
;}
;{apesanteur
;-apesanteur
apesanteur:
If balle(0)\sensy<=4
	balle(0)\sensy=balle(0)\sensy+0.08
	; Debug balle(0)\sensy
EndIf


If balle(0)\y>730
	balle(0)\sensy=0
	balle(0)\sensx=0
	perdu.b=1  
EndIf
Return
;}
;{ avance la balle
;- avance la balle
avance_la_balle:

balle(0)\x=balle(0)\x+balle(0)\sensx ; fait avancer les balles
balle(0)\y=balle(0)\y+balle(0)\sensy
Return
;}
;} ***********************************************************

; *************************************************************

;{ **************** Zone des procedures ******************
Procedure msg_erreur(chaine$)
	MessageRequester ( "erreur" , chaine$, #PB_MessageRequester_Ok )
EndProcedure
;} *************************************************************

; fin 
; Epb

Dernière modification par Backup le mar. 08/juil./2014 14:23, modifié 5 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

:lol:
Marcus
Messages : 187
Inscription : jeu. 22/janv./2004 19:08
Contact :

Message par Marcus »

EXCELLENT :)
les rebonds de la balle sur les flips sont un exercice de code tres interessant ...

A quand un PinballDream en Pure
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Sympa :D il reste encore des bugs, la balle sort alors qu'elle traverse "une renvoi" (Comment on apelle ça), sinont'as jamais pensé à faire un oeuf à contresens sur l'autoroute ? :p
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

trop classe :D
un tantinet pas tres réaliste mais déjà super convaincant

meilleur score : 32000 et des poussieres
mon oeuf c'est bloqué dans un bumper, un moment j'en ai eu marre et je l'ai sorti de là à coups de poing (ctrl) pour finalement perdre lol

Dri :10:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

mis a jour pour la V4.00

rajout de l'utilisation des boutons du joystick pour commander
les flip et le massage (bouton 2 et 3 pour les flip et bouton 4 pour le massage , bouton 1 pour relancer :D

l'utilisation des touche de clavier Shift gauche et droit
peut ammener des problemes a cause de l'autorepetitions des touches
cela entraine une vibration des flips.. c'est pourquoi j'ai ajouté le joystick :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ne faite pas cuire d'oeuf le matin !!

Message par Backup »

Mise a jour du code pour la Version 5.22 :)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: ne faite pas cuire d'oeuf le matin !!

Message par Frenchy Pilou »

Un flipper chauffant! :lol:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ne faite pas cuire d'oeuf le matin !!

Message par Backup »

oui, j'avais du fumer le moquette a l'epoque :)

je suis surpris qu'il n'y ai a ma connaissance, jamais eu de Flipper en Purebasic
celui ci n'est pas parfait, c'est clair, mais c'est le premier :)
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ne faite pas cuire d'oeuf le matin !!

Message par Ar-S »

Excellent :)
Les flips pivotent bizarrement mais ça donne envie. Figure toi que je pensais au flip pour le purepunch mais je suis passé sur autre chose (et puis 50lignes pour le flip c'est un peu chaud je pense)
En tout cas ce sont de bonnes bases
~~~~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
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: ne faite pas cuire d'oeuf le matin !!

Message par david »

Ar-S a écrit :Excellent :)
Les flips pivotent bizarrement mais ça donne envie. Figure toi que je pensais au flip pour le purepunch mais je suis passé sur autre chose (et puis 50lignes pour le flip c'est un peu chaud je pense)
En tout cas ce sont de bonnes bases
J'ai remplacé ligne 317 et 318 pour l'effet des flipp levés

Code : Tout sélectionner

   If left=0
     DisplaySprite ( #flip_gauche ,flip(0)\x, flip(0)\y)
   Else
     DisplaySprite ( #flip_gauche ,flip(0)\x-6, flip(0)\y-25)
   EndIf
   
   If right=0
     DisplaySprite ( #flip_droit ,flip(1)\x, flip(1)\y)
   Else
     DisplaySprite ( #flip_droit ,flip(1)\x+6, flip(1)\y-25)
   EndIf
 
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: ne faite pas cuire d'oeuf le matin !!

Message par david »

je voulais voir ce que cela donnerait avec une configuration proche d'un flipper, mais j'arriverais pas
voici ou je m'arrête (etant mega débutant c'est juste du bidouillage)
normalement les flips en position non levés doivent descendre un peu plus (avec une pente qui ressembe un peu à #basgauche & #basdroit)
mais après il faudrait rebondir sur #basgauche & #basdroit et là c'est plus mon domaine!!!

c'est dommage parcequ'un flipp en pb c'est trop génial
si ça intéresse quelqu'un je peu prendre les cotes d'un vrai flipper pour rendre cela encore plus fidele (meme si j'ai bien compris qu'a la base c'est la gaziniere de Dobro, mais bon, pourquoi ne pas rever du flipper de Dobro)
en tout cas si ca donne des idées à quelqu'un j'essaierais de trouver des sons/images.... qui pourront compléter tout ca...

Code : Tout sélectionner

; realisé par Dobro en pure v 3.93
; mis en version purebasic 5.22

;- déclarations des procedures
;*******************************************************************************************************
Declare msg_erreur(chaine$)
;*******************************************************************************************************
;- test du materiel
;*******************************************************************************************************
If InitSprite ()=0
   msg_erreur( "impossible d'initialiser les sprites" + Chr (10)+ " le prg va quitter " )
   End
EndIf
If InitMouse ()=0
   msg_erreur( "impossible d'initialiser la souris" + Chr (10)+ " le prg va quitter " )
   End
EndIf

If InitKeyboard ()=0
   msg_erreur( "impossible d'initialiser le clavier" + Chr (10)+ " le prg va quitter " )
   End
EndIf
If InitJoystick()=0
   msg_erreur( "impossible d'initialiser le joystick" + Chr (10)+ " on va continuer sans " )
   joystick=0
   Else
   joystick=1 ; le joystick est present !!²
EndIf

InitSprite()
;*******************************************************************************************************
;-initialisations constante structure tableaux variables
;*******************************************************************************************************
Enumeration
   #joystick
   #window
   #Sprite
   #flip_gauche
   #flip_droit
   #bumper
   
   #balle
   
   #top
   #topgauche
   #topdroit
   #gauche
   #droit
   #basgauche
   #basdroit
   
   #feu
   #feu2
   
   #Police_Texte    ;police d'écriture Texte
   #Police_Score    ;police d'écriture Score

   EndEnumeration
Structure balle
   x.w
   y.w
   sensx.f
   sensy.f
EndStructure
nbr_balle=0
Dim balle.balle(1) ; on cree 1 instance de balle

Structure flip
   x.w
   y.w
EndStructure
Dim flip.flip(1) ; 0 et 1

Structure bumper
   x.w
   y.w
EndStructure
Dim bumper.bumper(10) ; 0 a 3

Structure top
   x.w
   y.w
EndStructure

Structure feu
   x.w
   y.w
EndStructure
Dim feu.feu(10)

Structure feu1
   x.w
   y.w
EndStructure
Dim feu1.feu1(2)

Structure feu2
   x.w
   y.w
EndStructure
Dim feu2.feu2(2)

Structure feu3
   x.w
   y.w
EndStructure
 #decaler = 300
Dim feu3.feu3(2)
Dim top.top(10) ; 0 et 1
; affecte des coordonees aleatoire et place les balles
xd=Random(500,450)
yd=Random(300,100)

balle(0)\x=xd ; placement de la balle
balle(0)\y=yd

sensx=Random(1 ,0):If sensx=0:sensx-1:EndIf ;////////
sensy=Random(1 ,0):If sensy=0:sensy-1:EndIf ;////////
balle(0)\sensx=sensx ; determine le sens de deplacement de la balle et la vitesse
balle(0)\sensy=sensy
flip(0)\x=350
flip(0)\y=454
flip(1)\x=546
flip(1)\y=454
bumper(0)\x=300
bumper(0)\y=100
bumper(1)\x=600
bumper(1)\y=100
bumper(2)\x=300
bumper(2)\y=300
bumper(3)\x=600
bumper(3)\y=300
top(0)\x=200 ; haut
top(0)\y=50
top(1)\x=200 ; gauche
top(1)\y=50
top(2)\x=800 ; droit
top(2)\y=50
top(3)\x=200 ; basgauche
top(3)\y=500
top(4)\x=675 ; basdroit
top(4)\y=500
feu(0)\x=bumper(0)\x
feu(0)\y=bumper(0)\y
feu(1)\x=bumper(1)\x
feu(1)\y=bumper(1)\y
feu(2)\x=bumper(2)\x
feu(2)\y=bumper(2)\y
feu(3)\x=bumper(3)\x
feu(3)\y=bumper(3)\y

;*******************************************************************************************************
;-recupère dimensions écran
ExamineDesktops()
   Ecran_X = DesktopX(0)
   Ecran_Y = DesktopY(0)
   Ecran_L = DesktopWidth(0)
   Ecran_H = DesktopHeight(0)
   ;*******************************************************************************************************
   ;-charge la police d'écriture
 LoadFont(#Police_Texte, "Comic sans ms", 20, #PB_Font_Bold)
 LoadFont(#Police_Score, "Comic sans ms", 60, #PB_Font_Bold)
 ;*******************************************************************************************************
;-ouvre ecran
OpenWindow(#window,10,1,Ecran_L,Ecran_H,"Gaziniere a Dobro", #PB_Window_BorderLess | #PB_Window_Maximize );   );#PB_Window_SystemMenu
OpenWindowedScreen (WindowID(#window),1,1,Ecran_L,Ecran_H, 1,1,1 )
KeyboardMode (1)
;*******************************************************************************************************
;-creation des sprites du jeu
coul=coul+10
sprite=sprite
aa= CreateSprite ( #balle ,32,32, #PB_Sprite_PixelCollision ) ; on cree un sprite (une balle)
StartDrawing ( SpriteOutput ( #balle ) ) ; on va dessiner dans le sprite
   Circle (16, 16, 16, RGB (98,98,98)) ; on dessine un rond BLANC dedans(dans le sprite)
   Circle (20, 12, 8, RGB (129,129,129))
StopDrawing ()

ac= CreateSprite ( #flip_gauche ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #flip_gauche ) ) ; on va dessiner dans le sprite
   Circle (16, 64, 16, RGB ($F1,0,$F))
   LineXY (16, 64-16, 128, 64, RGB ($F1,0,$F))
   LineXY (16, 64+16, 128, 64, RGB ($F1,0,$F))
   FillArea (40, 66, RGB ($F1,0,$F), RGB ($F1,0,$F))
   ; Plot(40,66,RGB($FF,$FF,$F))
StopDrawing ()

ae= CreateSprite ( #flip_droit ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #flip_droit ) ) ; on va dessiner dans le sprite
   Circle (128-16, 64, 16, RGB ($F1,0,$F))
   LineXY (128-16, 64-16, 0, 64, RGB ($F1,0,$F))
   LineXY (128-16, 64+16, 0, 64, RGB ($F1,0,$F))
   FillArea (80, 66, RGB ($F1,0,$F), RGB ($F1,0,$F))
   ;Plot(80,66,RGB($FF,$FF,$F))
StopDrawing ()

ag= CreateSprite ( #bumper ,128,128, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #bumper ))
   For i=64 To 1 Step-10
      Circle (128/2, 128/2, i , RGB (10,i*2,i*2))
   Next i
StopDrawing ()

ai= CreateSprite ( #top ,600,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #top ))
   Box (0, 0, 600, 32, RGB ($FC,$F4,$65))
   BackColor (RGB(0, 0 ,0))
   FrontColor (RGB(0,0,0))
   DrawingMode (1)
   DrawText (280,8, "La gaziniere a Dobro" )
StopDrawing ()

CreateSprite ( #gauche ,32,Ecran_H-100, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #gauche ))
   Box (0, 0, 32, Ecran_H-100, RGB ($FC,$14,$65))
StopDrawing ()
CreateSprite ( #droit ,32,Ecran_H-100, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #droit ))
   Box (0, 0, 32, Ecran_H-100, RGB ($FC,$14,$65))
StopDrawing ()
CreateSprite ( #basgauche ,150,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #basgauche ))
   Box (0, 0, 150, 32, RGB ($FC,$F4,$65))
StopDrawing ()
CreateSprite ( #basdroit ,155,32, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #basdroit ))
   Box (0, 0, 155, 32, RGB ($FC,$F4,$65))
StopDrawing ()
CreateSprite ( #feu ,110,110, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #feu ))
   Box (0, 0, 150, 150, RGB ($FF,$0,$0))
StopDrawing ()
CreateSprite ( #feu2 ,110,110, #PB_Sprite_PixelCollision )
StartDrawing ( SpriteOutput ( #feu2 ))
   Box (0, 0, 150, 150, RGB ($FF,$F9,$0))
StopDrawing ()

RotateSprite( #feu ,30,#PB_Relative)
RotateSprite( #feu2 ,-30,#PB_Relative)
; ZoomSprite3D(#bumper3d, 64, 64)
;*******************************************************************************************************
;-boucle principale
Repeat
   
   ;- examine le materiel
   ;*******************************************************************************************************
   ExamineKeyboard ()
   KeyboardMode (1)
   ExamineMouse ()
   If joystick=1
      ExamineJoystick (#joystick) ; optionel on examine seulement si present !!
   EndIf
   
   ;*******************************************************************************************************
   ; serie de gosub ou appel de procedure a mettre ici
   ;*******************************************************************************************************
   Gosub dessin_sur_ecran ; trace une ligne sur l'ecran et une serie de cercles
   Gosub calcul_des_rebonds
   Gosub apesanteur
   Gosub avance_la_balle
   ;*******************************************************************************************************
   ;{ interroge le clavier et joystick
   ;- interoge le clavier
   
   
   If  KeyboardPushed(#PB_Key_RightShift )
      RotateSprite ( #flip_droit , 30,0)
      right=1
      Else
      RotateSprite ( #flip_droit , 0, 0)
      right=0
   EndIf
   
   If  KeyboardPushed(#PB_Key_LeftShift )
      RotateSprite ( #flip_gauche , -30, 0)
      left=1
      Else
      RotateSprite ( #flip_gauche ,0, 0)
      left=0
   EndIf
   If perdu.b=1 Or balle(0)\sensx=0 And balle(0)\sensy=0
      If   KeyboardPushed(#PB_Key_Down )
         xd=Random(500,450)
         yd=Random(300,100)
         balle(0)\x=xd ; placement de la balle
         balle(0)\y=yd
         
         
sensx=Random(1 ,0):If sensx=0:sensx-1:EndIf ;////////
sensy=Random(1 ,0):If sensy=0:sensy-1:EndIf ;////////
balle(0)\sensx=sensx ; determine le sens de deplacement de la balle et la vitesse
balle(0)\sensy=sensy
 ; determine le sens de deplacement de la balle et la vitesse
         balle(0)\sensy=1
         point=0
      EndIf
   EndIf
   If KeyboardPushed(#PB_Key_Space ) ; massage
      balle(0)\sensx=balle(0)\sensx-0.04
      top(0)\x=200-5 ; haut
      top(1)\x=200-5 ; gauche
      top(2)\x=800 -5 ; droit
      top(3)\x=200-5 ; basgauche
      top(4)\x=675 -5 ; basdroit
      bumper(0)\x=300-5
      bumper(1)\x=600-5
      bumper(2)\x=300-5
      bumper(3)\x=600-5
      Else
      top(0)\x=200 ; haut
      top(1)\x=200 ; gauche
      top(2)\x=800 ; droit
      top(3)\x=200 ; basgauche
      top(4)\x=675 ; basdroit
      bumper(0)\x=300
      bumper(1)\x=600
      bumper(2)\x=300
      bumper(3)\x=600
   EndIf
   
   
   ;}
   If balle(0)\sensy<-12
      balle(0)\sensy=-8
   EndIf
   If balle(0)\sensx<-8
      balle(0)\sensx=-6
   EndIf
   If balle(0)\sensx>8
      balle(0)\sensx=6
   EndIf
   
   
   
   
   ;{affichage des sprites
   ;-affichage des sprites
   ;*******************************************************************************************************
   ;Start ()
   If left=0
     DisplaySprite ( #flip_gauche ,flip(0)\x, flip(0)\y+#decaler)
   Else
     DisplaySprite ( #flip_gauche ,flip(0)\x-6, flip(0)\y+#decaler-25)
   EndIf
   
   If right=0
     DisplaySprite ( #flip_droit ,flip(1)\x, flip(1)\y+#decaler)
   Else
     DisplaySprite ( #flip_droit ,flip(1)\x+6, flip(1)\y+#decaler-25)
   EndIf
  
   DisplaySprite ( #bumper ,bumper(0)\x, bumper(0)\y)
   DisplaySprite ( #bumper ,bumper(1)\x, bumper(1)\y)
   DisplaySprite ( #bumper ,bumper(2)\x, bumper(2)\y)
   DisplaySprite ( #bumper ,bumper(3)\x, bumper(3)\y)
   DisplaySprite ( #balle , balle(0)\x,balle(0)\y)
   DisplaySprite ( #top , top(0)\x,top(0)\y)
   
   RotateSprite(#basgauche, 30,0)
   DisplaySprite ( #basgauche , top(3)\x,top(3)\y +#decaler-35) ;barre flipL
   
   RotateSprite  (#basdroit , -30,0)
   DisplaySprite (#basdroit ,  top(4)\x,top(4)\y+ #decaler-35) ;barre fliR
   
   DisplaySprite ( #gauche , top(1)\x,top(1)\y) ;barre verticaleL
   DisplaySprite ( #droit ,top(2)\x,top(2)\y) ;barre verticaleR
   ; balle(0)\x=MouseX()
   ; balle(0)\y=MouseY() ;
   ; DisplaySprite3D( #balle3d, balle(0)\x, balle(0)\y)
   ;Stop ()
   ;*******************************************************************************************************
   ;}
   
   FlipBuffers () ; affiche le resultat a l'ecran ! 
   
   ClearScreen (RGB(0,0,0)) ; nettoie l'ecran apres affichage
Until KeyboardPushed ( #PB_Key_Escape ) Or MouseButton (2)
End

;{ ********* Zone des sous-programme ******************
;{ dessin_sur_ecran
;- dessin_sur_ecran
dessin_sur_ecran:
StartDrawing ( ScreenOutput ())

     DrawingFont(FontID(#Police_Texte))
     DrawText(Ecran_L*2/3,Ecran_Y+10, "SHIFT (gauche et droit) pour les flips", RGB(255, 0, 0), RGB(0, 0, 0))
     DrawText(Ecran_L*2/3,Ecran_Y+60, "ESPACE pour vibrer", RGB(255, 0, 0), RGB(0, 0, 0))
     DrawText(Ecran_L*2/3,Ecran_Y+110, "Fleche BAS pour relancer", RGB(255, 0, 0), RGB(0, 0, 0))
     
     DrawingFont(FontID(#Police_Score))
     DrawText(Ecran_L*3/5,Ecran_Y+200, " points :" + Str (point), RGB(255, 255, 0), RGB(0, 0, 0))

StopDrawing ()
Return
;}

;{calcul_des_rebonds
;-calcul_des_rebonds
calcul_des_rebonds:
; collision flip gauche
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_gauche ,flip(0)\x, flip(0)\y+ #decaler)<>0 And left=1
   balle(0)\sensy=- balle(0)\sensy-6
   balle(0)\sensx=- balle(0)\sensx-4
   ElseIf SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_gauche ,flip(0)\x, flip(0)\y+ #decaler)<>0 And left=0
   balle(0)\sensy=- balle(0)\sensy+0.08
EndIf
; collision flip droit
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_droit ,flip(1)\x, flip(1)\y+ #decaler)<>0 And right=1
   balle(0)\sensy=-balle(0)\sensy-6
   balle(0)\sensx=-balle(0)\sensx-4
   If balle(0)\sensy<-12
      balle(0)\sensy=-8
   EndIf
   ElseIf SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #flip_droit ,flip(1)\x, flip(1)\y +#decaler)<>0 And right=0
   balle(0)\sensy=-balle(0)\sensy+0.08
EndIf

; collision bumpers
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(0)\x, bumper(0)\y)<>0
   If balle(0)\x<=bumper(0)\x Or balle(0)\x>=bumper(0)\x+64
      balle(0)\sensx=-balle(0)\sensx
   EndIf
   If balle(0)\y<=bumper(0)\y Or balle(0)\y>=bumper(0)\y+64
      balle(0)\sensy=-balle(0)\sensy
   EndIf
   ;Start ()
   DisplayTransparentSprite ( #feu , feu(0)\x+10,feu(0)\y+10)
   DisplayTransparentSprite ( #feu2 , feu(0)\x+10,feu(0)\y+10)
   ;Stop ()
   point=point+10
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(1)\x, bumper(1)\y)<>0
   If balle(0)\x<=bumper(1)\x Or balle(0)\x>=bumper(1)\x+64
      balle(0)\sensx=-balle(0)\sensx
   EndIf
   If balle(0)\y<=bumper(1)\y Or balle(0)\y>=bumper(1)\y+64
      balle(0)\sensy=-balle(0)\sensy
   EndIf
   ;Start ()
   DisplayTransparentSprite ( #feu , feu(1)\x+10,feu(1)\y+10)
   DisplayTransparentSprite ( #feu2 , feu(1)\x+10,feu(1)\y+10)
   ;Stop ()
   point=point+10
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(2)\x, bumper(2)\y)<>0
   If balle(0)\x<=bumper(2)\x Or balle(0)\x>=bumper(2)\x+64
      balle(0)\sensx=-balle(0)\sensx
   EndIf
   If balle(0)\y<=bumper(2)\y Or balle(0)\y>=bumper(2)\y+64
      balle(0)\sensy=-balle(0)\sensy
   EndIf
   ;Start ()
   DisplayTransparentSprite ( #feu , feu(2)\x+10,feu(2)\y+10)
   DisplayTransparentSprite ( #feu2, feu(2)\x+10,feu(2)\y+10)
   ;Stop (
   point=point+10
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #bumper ,bumper(3)\x, bumper(3)\y)<>0
   If balle(0)\x<=bumper(3)\x Or balle(0)\x>=bumper(3)\x+64
      balle(0)\sensx=-balle(0)\sensx
   EndIf
   If balle(0)\y<=bumper(3)\y Or balle(0)\y>=bumper(3)\y+64
      balle(0)\sensy=-balle(0)\sensy
   EndIf
   ;Start ()
   DisplayTransparentSprite ( #feu , feu(3)\x+10,feu(3)\y+10)
   DisplayTransparentSprite ( #feu2 , feu(3)\x+10,feu(3)\y+10)
   ;Stop ()
   point=point+10
EndIf
;************************ collision avec le decor ! *************************************************

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #top ,top(0)\x, top(0)\y)<>0
   balle(0)\sensy=-balle(0)\sensy
EndIf

If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #gauche ,top(1)\x, top(1)\y)<>0
   balle(0)\sensx=-balle(0)\sensx
   If balle(0)\sensx>0
      balle(0)\sensx=balle(0)\sensx-0.2
   EndIf
   If balle(0)\sensx<0
      balle(0)\sensx=-balle(0)\sensx-0.4
   EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #droit ,top(2)\x, top(2)\y)<>0
   balle(0)\sensx=-balle(0)\sensx
   If balle(0)\sensx>0
      balle(0)\sensx=balle(0)\sensx-0.2
      If balle(0)\sensx=0
         balle(0)\sensx=0
      EndIf
   EndIf
   If balle(0)\sensx<0
      balle(0)\sensx=balle(0)\sensx-0.2
      If balle(0)\sensx=0
         balle(0)\sensx=0
      EndIf
      
   EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #basgauche ,top(3)\x, top(3)\y+ #decaler)<>0
   balle(0)\sensy=-balle(0)\sensy
   If balle(0)\sensy<=0
      balle(0)\sensy=balle(0)\sensy+0.08
   EndIf
EndIf
If SpritePixelCollision ( #balle , balle(0)\x, balle(0)\y, #basdroit ,top(4)\x, top(4)\y+ #decaler)<>0
   balle(0)\sensy=-balle(0)\sensy
   If balle(0)\sensy<=0
      balle(0)\sensy=balle(0)\sensy+0.08
   EndIf
EndIf
; ***********************
Return
;}
;{apesanteur
;-apesanteur
apesanteur:
If balle(0)\sensy<=4
   balle(0)\sensy=balle(0)\sensy+0.08
   ; Debug balle(0)\sensy
EndIf


If balle(0)\y> #decaler+730
   balle(0)\sensy=0
   balle(0)\sensx=0
   perdu.b=1 
EndIf
Return
;}
;{ avance la balle
;- avance la balle
avance_la_balle:

balle(0)\x=balle(0)\x+balle(0)\sensx ; fait avancer les balles
balle(0)\y=balle(0)\y+balle(0)\sensy
Return
;}
;} ***********************************************************

; *************************************************************

;{ **************** Zone des procedures ******************
Procedure msg_erreur(chaine$)
   MessageRequester ( "erreur" , chaine$, #PB_MessageRequester_Ok )
EndProcedure
;} *************************************************************

; fin
; Epb

Répondre