Re: [2D] particules
Publié : sam. 30/avr./2011 12:31
Hello,
Tu pouvais utiliser les coordonnées polaires (x=Rx*cos(a) et y=Ry*sin(a)) pour tracer la spirale, ça ne change rien aux calculs tout dépend de tes besoins.
Tu peux même précalculer les cos et les sin.
La spécifité du code c'était surtout l'inclinaison des ellipses
La méthode d'Euler permet d'effectuer un grand nombre de calculs, pour les particules, ça pourrait être utile :
(un autre code réactualisé (j'ai remplacé UseBuffer() par un GrabSprite (Merci G-Rom !) A l'époque, j'avais cherché une méthode pour tester ma pseudo carte graphique (comparer avec ou sans débugger)!!!)
http://www.purebasic.fr/french/viewtopi ... echistique
(Il y des fautes d'orthographes
baListique, flèche
)
(Diminue le nombre de flèches(600 par exemple) pour avoir un effet plus esthétique (Façon Léonidas de "300"
))
Hasta la vista !
Tu pouvais utiliser les coordonnées polaires (x=Rx*cos(a) et y=Ry*sin(a)) pour tracer la spirale, ça ne change rien aux calculs tout dépend de tes besoins.
Tu peux même précalculer les cos et les sin.
La spécifité du code c'était surtout l'inclinaison des ellipses

La méthode d'Euler permet d'effectuer un grand nombre de calculs, pour les particules, ça pourrait être utile :
(un autre code réactualisé (j'ai remplacé UseBuffer() par un GrabSprite (Merci G-Rom !) A l'époque, j'avais cherché une méthode pour tester ma pseudo carte graphique (comparer avec ou sans débugger)!!!)
http://www.purebasic.fr/french/viewtopi ... echistique
(Il y des fautes d'orthographes


(Diminue le nombre de flèches(600 par exemple) pour avoir un effet plus esthétique (Façon Léonidas de "300"

Code : Tout sélectionner
;trajectoires de projectiles
;auteur Huitbit
;pb v4.60;*********************************
#largeur_ecran=1024
#hauteur_ecran=768
;de 0 à 23, sprites de la flèche en rotation
#spr_fleche=24
#x_fleche_initial=#largeur_ecran/2
#y_fleche_initial=#hauteur_ecran/2
;-nombre de flèches
n.w=6000
Structure fleche
x.w
y.w
vx.w
vy.w
EndStructure
;-pas du calcul
dt.b=1
;-initialisation
;-précalcul du numéro du sprite à afficher
*MemoireID_numero_sprite = AllocateMemory(10200);
For vx=-50 To 50 ;vitesse maximale 50
If vx<>0
For vy=-50 To 50
numero_sprite= Int(180*ATan(vy/vx)/#PI/15) ; valeurs possibles de l'arctangente / 15 car 24 ( c'est à dire 360/15) flêches
If vx<0
numero_sprite=12+numero_sprite
ElseIf vx>0 And vy<0
numero_sprite=24+numero_sprite
EndIf
PokeB(*MemoireID_numero_sprite +(vx+50)*100+vy+50, numero_sprite)
Next vy
EndIf
Next vx
Dim fleche.fleche(n)
For i=0 To n
fleche(i)\x=#x_fleche_initial
fleche(i)\y=#y_fleche_initial
fleche(i)\vx=-30+Random(60)
fleche(i)\vy=-30+Random(60)
If fleche(i)\vx=0
fleche(i)\vx=1
EndIf
Next i
;-PROGRAMME PRINCIPAL
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"Projectile",#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)
;-dessin de la flêche
CreateSprite(#spr_fleche,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_fleche))
Ellipse(24,16,8,4,RGB(100,100,255))
Box(18,8,4,16,RGB(0,0,0))
Box(0,11,7,10,RGB(0,0,255))
Box(7,12,2,8,RGB(0,0,200))
Box(0,14,24,4,RGB(190, 127, 11))
StopDrawing()
CreateSprite3D(#spr_fleche,#spr_fleche)
;-dessin de la flèche dans toutes les positions
index_sprite=0
Start3D()
For angle=0 To 345 Step 15
RotateSprite3D(#spr_fleche,angle,0)
DisplaySprite3D(#spr_fleche,index_sprite*32,0)
index_sprite=index_sprite+1
Next angle
Stop3D()
For i=0 To 23
GrabSprite(i,i*32,0,32,32) ;découpage du sprite en 24 sprites
Next i
;-BOUCLE PRINCIPALE
Repeat
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
ClearScreen(RGB(0,0,0))
For i=0 To n
If fleche(i)\x<#largeur_ecran And fleche(i)\x>0 And fleche(i)\y<#hauteur_ecran And fleche(i)\y>0
fleche(i)\vy= fleche(i)\vy+dt
; fleche(i)\x= fleche(i)\x+ fleche(i)\vx*dt
; fleche(i)\y= fleche(i)\y+ fleche(i)\vy*dt
;Ici on choisi dt=1
fleche(i)\x= fleche(i)\x+ fleche(i)\vx
fleche(i)\y= fleche(i)\y+ fleche(i)\vy
DisplayTransparentSprite(PeekB(*MemoireID_numero_sprite +(fleche(i)\vx+50)*100+fleche(i)\vy+50), fleche(i)\x, fleche(i)\y)
Else
fleche(i)\x=#x_fleche_initial
fleche(i)\y=#y_fleche_initial
fleche(i)\vx=-30+Random(60)
fleche(i)\vy=-30+Random(60)
If fleche(i)\vx=0
fleche(i)\vx=1
EndIf
EndIf
Next i
;-calcul du fps
If Second < ElapsedMilliseconds()
Second = ElapsedMilliseconds()+1000
fps = Frame_Counter
Frame_Counter = 0
Else
Frame_Counter + 1
EndIf
StartDrawing(ScreenOutput())
DrawText(16,16,"FPS : "+Str(fps))
DrawText(16,32,"Nombre de flèches : "+Str(n))
StopDrawing()
Delay(1)
FlipBuffers()
ForEver