Le Général Custer n'a plus qu'à se faire tout petit !


Désolé pour le néologisme mais pour la trajectoire des flêches, je connais pas l'équivalent de ballistique !
La flêche est un peu moche mais c'est pas grave

J'ai repris la méthode d'Euler mais avec des entiers.
Le code peut-être optimisé (précalcul de Atan?!) mais même avec beaucoup de flêches, c'est très fluide

Code : Tout sélectionner
;trajectoires de projectiles
;auteur Huitbit
;pb v4.10
;*********************************
#largeur_ecran=1024
#hauteur_ecran=768
#spr_fleche=0
;-nombre de flêches
n.w=200
Structure fleche
x.w
y.w
vx.w
vy.w
symetrie.b; pour l'orientation du sprite
EndStructure
;-pas du calcul
dt.b=1
;-initialisation
Dim fleche.fleche(n)
For i=0 To n
fleche(i)\x=#largeur_ecran*0.5
fleche(i)\y=#hauteur_ecran*0.5
fleche(i)\vx=-30+Random(60)
fleche(i)\vy=-30+Random(60)
If fleche(i)\vx=0
fleche(i)\vx=10
EndIf
If fleche(i)\vx<0
fleche(i)\symetrie=1
Else
fleche(i)\symetrie=0
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)
;-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
Start3D()
RotateSprite3D(#spr_fleche,Int(180*ATan( fleche(i)\vy/ fleche(i)\vx)/#PI)+180*fleche(i)\symetrie,0)
DisplaySprite3D(#spr_fleche, fleche(i)\x, fleche(i)\y)
Stop3D()
Else
fleche(i)\x=#largeur_ecran*0.5
fleche(i)\y=#hauteur_ecran*0.5
fleche(i)\vx=-30+Random(60)
fleche(i)\vy=-30+Random(60)
If fleche(i)\vx=0
fleche(i)\vx=10
EndIf
If fleche(i)\vx<0
fleche(i)\symetrie=1
Else
fleche(i)\symetrie=0
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))
StopDrawing()
Delay(1)
FlipBuffers()
ForEver
PS: le code version light
Code : Tout sélectionner
;trajectoires de projectiles
;pb v4.10
;auteur Huitbit
;*********************************
#largeur_ecran=1024
#hauteur_ecran=768
#spr_fleche=0
inclinaison_fleche.b
x.w=5;abscisse initiale
y.w=398;ordonnée initiale
v0.w=32;intensité de la vitesse initiale
angle_tir.f=55*#PI/180;angle_tir initial
vx.w=Int(v0*Cos(angle_tir))
vy.w=-Int(v0*Sin(angle_tir))
;-pas du calcul
dt.b=1
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)
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)
Repeat
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
End
EndIf
Until Event = 0
If x<#largeur_ecran-32 And y<#hauteur_ecran-32
ClearScreen(RGB(0,0,0))
vy=vy+dt
x=x+vx*dt
y=y+vy*dt
inclinaison_fleche=Int(180*ATan(vy/vx)/#PI)
Start3D()
RotateSprite3D(#spr_fleche,inclinaison_fleche,0)
DisplaySprite3D(#spr_fleche,x,y)
Stop3D()
EndIf
Delay(1)
FlipBuffers()
ForEver