Collision
Publié : lun. 01/nov./2004 16:35
Bonjour à tous !
Voici un petit programme qui ne sert à rien mais qui permet de se familiariser avec les sprites et les collisions.
Mon seul regret, je n'ai pas réussi à faire la même chose avec les listes chaînées.
Je ne vois pas comment tester les collisions entre les différentes balles. Dans mon programme je teste la première balle du tableau et je regarde si une collision a eu lieu avec les autres balles en imbriquant deux boucles, mais avec les listes...
Voici le code :
Voilà j'espère qu'il est assez documenté et compréhensible.
Si des fois quelqu'un sait comment faire avec les listes je suis preneur pour apprendre.
Merci d'avance et à plus.
Voici un petit programme qui ne sert à rien mais qui permet de se familiariser avec les sprites et les collisions.
Mon seul regret, je n'ai pas réussi à faire la même chose avec les listes chaînées.

Je ne vois pas comment tester les collisions entre les différentes balles. Dans mon programme je teste la première balle du tableau et je regarde si une collision a eu lieu avec les autres balles en imbriquant deux boucles, mais avec les listes...

Voici le code :
Code : Tout sélectionner
;----------------------------------------
;Good07
;Programme collision 1/11/2004
;Pure Basic version 3.92
;----------------------------------------
; Petit programme qui ne sert à rien sauf pour étudier les collisions entre sprite
; quand deux boules de la même couleur entrent en collision leur couleur change suivant le code ci-après:
; bleu+bleu=vert
; vert+vert=rouge
; rouge+rouge=bleu
;
InitSprite()
InitKeyboard()
#Longueur = 800 ;longueur de l'écran en pixel
#hauteur = 600 ; largeur de l'écran
#depth=32 ; nombre de couleurs
nbballe=50 ; nombre de balles
Dim balle_x.f(nbballe)
Dim balle_y.f(nbballe)
Dim balle_dx.f(nbballe)
Dim balle_dy.f(nbballe)
Dim balle_cr.b(nbballe)
For a=0 To nbballe
balle_x(a)=Random(#Longueur)-32
balle_y(a)=Random(#hauteur)-32
balle_dx(a)=Random(1)+1
balle_dy(a)=Random(1)+1
balle_cr(a)=Random(2)+1
Next a
If OpenScreen(#Longueur,#hauteur,#depth,"Balle collision")=0
MessageRequester("Attention !", "Could not create DirectX screen",#PB_MessageRequester_Ok)
End
EndIf
Procedure CreateBallSprite(c.l,size.l,color.l);procedure qui dessine les balles extrait de code archive
CreateSprite(c,size,size,#PB_Sprite_Memory )
StartDrawing(SpriteOutput(c))
BackColor(0,0,0):R.w=color&$FF:G.w=color>>8&$FF:b.w=color>>16&$FF
For t.l=size/2 To 1 Step -1
R+160/size:G+160/size:b+160/size:If R>255:R=255:EndIf:If G>255:G=255:EndIf:If b>255:b=255:EndIf
Circle(size/2,size/2,t,RGB(R,G,b))
Next
StopDrawing()
EndProcedure
CreateBallSprite(1,32,$E85D17);création de la balle bleu
CreateBallSprite(2,32,$A4F05B);création de la balle verte
CreateBallSprite(3,32,$0F19F0);création de la balle rouge
Repeat
StartSpecialFX()
ClearScreen(0,0,0)
For a=0 To nbballe
;Déplacement des balles
balle_x(a)=balle_x(a)+((balle_dx(a)))
balle_y(a)=balle_y(a)+((balle_dy(a)))
;détection des bords de l'écran
If balle_y(a)<1: balle_dy(a)=Random(2)+1:EndIf
If balle_y(a)>#hauteur-40:balle_dy(a)=-(Random(2)+1):EndIf
If balle_x(a)<1:balle_dx(a)=Random(2)+1:EndIf
If balle_x(a)>#Longueur-40:balle_dx(a)=-(Random(2)+1):EndIf
For b=a+1 To nbballe
If SpritePixelCollision(1,balle_x(a),balle_y(a),1,balle_x(b),balle_y(b)); détection des collisions
If balle_cr(a)=1 And balle_cr(b)=1; on teste la couleur bleu
balle_cr(a)=2 ; et on change la couleur en fonction du code établit précédemment
balle_cr(b)=2
Goto suite
EndIf
If balle_cr(a)=2 And balle_cr(b)=2; idem si dessus mais pour la couleur verte
balle_cr(a)=3
balle_cr(b)=3
Goto suite
EndIf
If balle_cr(a)=3 And balle_cr(b)=3; idem pour la couleur rouge
balle_cr(a)=1
balle_cr(b)=1
EndIf
suite:
If balle_x(a)<balle_x(b); déplacement des balles en fonction de la collision
balle_dx(a)=-1
balle_dx(b)=1
EndIf
If balle_x(a)>balle_x(b)
balle_dx(a)=1
balle_dx(b)=-1
EndIf
If balle_y(a)<balle_y(b)
balle_dy(a)=-1
balle_dy(b)=1
EndIf
If balle_y(a)>balle_y(b)
balle_dy(a)=1
balle_dy(b)=-1
EndIf
EndIf
Next b
DisplayTransparentSprite(balle_cr(a),balle_x(a),balle_y(a))
Next a
StopSpecialFX()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape); press Esc to quit
CloseScreen()
End
Si des fois quelqu'un sait comment faire avec les listes je suis preneur pour apprendre.

Merci d'avance et à plus.