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() 
ForEverPS: 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