merci pour ce tutoriel. C'est pas mal du tout pour débuter (c'est mon cas).
J'ai voulu ajouter des "declare" pour les procédures, en début de code. J'ai aussi voulu changer la couleur de chaque balle. Et je rencontre 2 petits bugs que je ne sais pas encore résoudre.
voici le code que j'ai corrigé et bidouillé

Code : Tout sélectionner
;{ Constantes et variables
nombre_balle=4; On veut 5 balles. Dans les boucles les sprites commencent a 0 !! donc on retire 1 a notre nombre de sprite
; utilisation des Constantes
Enumeration
#Window ; defini le numero de la fenetre employé
#Police
#raquette
EndEnumeration
;}
;{ Structure
Structure raquette
x.l ; position x de la raquette
y.l ;position y de la raquette
pas_x.l ; le deplacement en pixel en X
pas_y.l ; le deplacement en pixel en Y
EndStructure
Global Dim raquette.raquette(1) ; une seul raquette
Structure ball
x.l
y.l
pas_x.l
pas_y.l
vie.b
color.a ; byte de 0 à 255, pour définir la couleur
balle.l ; le sprite de chaque balle
EndStructure
Global Dim ball.ball(nombre_balle)
;}
;{ Initialisation
InitKeyboard () :; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 18, #PB_Font_Bold )
EcranX = 1024;GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = 768;GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
;}
;{ declaration des procedures
Declare ScreenRedraw()
Declare UpdateMap()
;}
;{ Fenetre- ecran
WindowID = OpenWindow (#Window, 0, 0,EcranX, EcranY, "Jeu de baballe" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen ( WindowID (#Window),0,0, EcranX,EcranY, 1, 0,0)
For i=0 To nombre_balle
ball(i)\color=RGB(Random(255),Random(255),Random(255)); couleur de la balle
; ******* creation d'un sprite Balle************
If CreateSprite (ball(i)\balle,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
StartDrawing ( SpriteOutput (ball(i)\balle) ) ; on va dessiner dedans !
Circle (16,16,16,ball(i)\color) ; on dessine un cercle rouge, ce sera la balle
StopDrawing ()
EndIf
Next i
; ***********************************************
; ******* creation d'un sprite raquette************
If CreateSprite (#raquette,128,16) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
StartDrawing ( SpriteOutput (#raquette) ) ; on va dessiner dedans !
Box (1,1,128, 16,RGB (0,255,0)) ; on dessine un cercle rouge, ce sera la balle
StopDrawing ()
EndIf
; ***********************************************
; *********************definition des position au debut du jeux ********************
For i=0 To nombre_balle
ball(i)\x=EcranX/2 ; on centre les coordonées du sprite en x
ball(i)\y=EcranY-64 ; on defini la position de la bal en y
Next i
raquette(1)\x=EcranX/2 ; on centre les coordonées de la raquette en x
raquette(1)\y=EcranY-32 ; on defini la position de la raquette en y
; ****************************************************************************
; ***initialisation de la vitesse de la balle***
For i= 0 To nombre_balle
des=Random(1)
ball(i)\pas_x= Random(8)+2 ; vitesse de la ball en x
If des=0
; on ne fait rien , on laisse le chiffre positif la balle partira a droite
Else
ball(i)\pas_x= -ball(i)\pas_x ; le chiffre est negatif, la balle partira a gauche
EndIf
ball(i)\pas_y=-Random(8)-2 ; vitesse de la ball en y
ball(i)\vie=1 ; on donne la vie a notre balle !
Next i
; *************************************
;}
;{ boucle principale
Repeat
Event= WindowEvent ()
;Delay (2)
ExamineKeyboard ()
UpdateMap()
FlipBuffers (): ; affiche l'ecran
ScreenRedraw()
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit
;}
Procedure ScreenRedraw()
ClearScreen(RGB(150,150,150))
EndProcedure
Procedure UpdateMap()
Shared FontID, EcranX
; ************ gere le deplacement de la raquette ****************************
If KeyboardPushed ( #PB_Key_Left ) ; press touche gauche
; Debug " press touche gauche"
raquette(1)\x=raquette(1)\x-16
If raquette(1)\x<0
raquette(1)\x=0
EndIf
EndIf
If KeyboardPushed ( #PB_Key_Right ) ; press touche droit
; Debug " press touche droit"
raquette(1)\x=raquette(1)\x+16
If raquette(1)\x>(EcranX-128)
raquette(1)\x=(EcranX-128)
EndIf
EndIf
; ************************************************************************
For u=0 To nombre_balle
If ball(u)\vie=1 ; si la ball est en vie
; gere le deplacement de la balle , ainsi que son rebond , et collision !! (et oui tout ça )
; ***** le deplacement ****
ball(u)\x=ball(u)\x+ball(u)\pas_x ; passe son temp a ajouter le pas
ball(u)\y=ball(u)\y+ball(u)\pas_y
; ***********************
; ********************* Collision avec l'ecran ******************************************
; gere le rebond sur les murs representés pas les bords de l'ecran !
; pour les X
; teste si la balle sort a droite
If ball(u)\x>(EcranX-32) ; si le X balle est superieur au X de l'ecran moins 32 ( le bord droit de l'ecran )
ball(u)\pas_x=-ball(u)\pas_x ; inverse le mouvement
EndIf
; test si la balle sort a gauche
If ball(u)\x<0 ; si le x de la ball est plus petit que 0 ( le bord gauche de l'ecran )
ball(u)\pas_x=-ball(u)\pas_x ; inverse le mouvement
EndIf
; pour les Y
; test si la balle sort en haut de l'ecran
If ball(u)\y<0
ball(u)\pas_y=-ball(u)\pas_y ; inverse le mouvement
EndIf
; ***************position par rapport a la Raquette **************************
; test si la balle sort en bas ( enfin si elle depasse la raquette !!! ) donc balle pas ratrappé
If ball(u)\y>(raquette(1)\y+16 )
ball(u)\vie=0 ; balle est morte ! sniff !
EndIf
EndIf
; ******************* Collision entre ball et raquette **************************
If SpritePixelCollision(ball(u)\balle, ball(u)\x, ball(u)\y, #raquette, raquette(1)\x, raquette(1)\y)
; inversion du pas de deplacement des y de la balle
ball(u)\pas_y=-ball(u)\pas_y ; inverse le mouvement
EndIf
; ***************************************************************************
; ********* AFFICHAGE **************************************************
DisplaySprite (#raquette,raquette(1)\x ,raquette(1)\y ) ; affiche le sprite raquette au coordonées modifié par les touches
If ball(u)\vie=1
DisplaySprite (ball(u)\balle,ball(u)\x ,ball(u)\y ) ; affiche le sprite balle
Else ; la balle est morte
StartDrawing(ScreenOutput())
DrawingFont(FontID)
DrawText(10,10,"Perdu",RGB($EC,$F8,$7))
StopDrawing()
EndIf
Next u
EndProcedure

Merci.