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
 
 

 (si je prends un tableau dix fois plus petit, je gagne une unité de FPS mais l'inclinaison n'est plus réaliste). Je mets le code quand même car je gère l'inclinaison de la flêche d'une manière différente.
 (si je prends un tableau dix fois plus petit, je gagne une unité de FPS mais l'inclinaison n'est plus réaliste). Je mets le code quand même car je gère l'inclinaison de la flêche d'une manière différente.