Page 1 sur 2

Flêchistique(explosion du FPS voir dernier post)

Publié : ven. 16/mai/2008 7:17
par Huitbit
Hello,
Le Général Custer n'a plus qu'à se faire tout petit ! :lol: :lol:
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 :roll:

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 :P
Image

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
Hasta la vista !

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

Publié : ven. 16/mai/2008 16:57
par Neosis
ça m'intéresse beaucoup :)
je vais mettre ça dans mes archive perso, bien joué huitbit
:wink:

Publié : ven. 16/mai/2008 17:45
par Sehka
Pas mal du tout ;)
Bientôt le 14 juillet ? :D
Salutations,

Publié : ven. 16/mai/2008 23:45
par Huitbit
Merci :P

Ajout du FPS dans le premier code.
Avec mon HP Pavilion "de l'espace"(FPS maximum constaté FPS=61)
Pour 1200 flêches, FPS = 24 (tant qu'on ne descend pas en dessous de 24, on reste dans le domaine du cinéma :D , 24 images par seconde).

Si vous avez des idées d'optimisation :wink:
(je vais essayer l'arctangente précalculée, on verra :roll: )

Hasta la vista !

[EDIT] J'ai calculé un tableau Atan_en_degre() qui donne des angles de 0° à environ 89°, aucun changement pour le FPS :? (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.

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=1000
Structure fleche
  x.w
  y.w
  vx.w
  vy.w
  inclinaison.w 
EndStructure
;-pas du calcul
dt.b=1
;-initialisation
Dim Atan_en_degre.w(480)
For i=0 To 480
  di.f=di+0.1
  Atan_en_degre(i)=180*ATan(di)/#PI
Next i
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=1
  EndIf
  If  fleche(i)\vx>0 And  fleche(i)\vy>=0
    fleche(i)\inclinaison=Atan_en_degre(Int( 10*fleche(i)\vy/ fleche(i)\vx))
  ElseIf fleche(i)\vx<0 And  fleche(i)\vy>=0
    fleche(i)\inclinaison=180-Atan_en_degre(Int(-10* fleche(i)\vy/ fleche(i)\vx))
  ElseIf fleche(i)\vx<0 And  fleche(i)\vy<0
    fleche(i)\inclinaison=180+Atan_en_degre(Int(10* fleche(i)\vy/ fleche(i)\vx))
  ElseIf fleche(i)\vx>0 And  fleche(i)\vy<0
    fleche(i)\inclinaison=360-Atan_en_degre(Int(-10* fleche(i)\vy/ fleche(i)\vx))
  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
      
      If  fleche(i)\vx>0 And  fleche(i)\vy>0
        fleche(i)\inclinaison=Atan_en_degre(Int( 10*fleche(i)\vy/ fleche(i)\vx))
      ElseIf fleche(i)\vx<0 And  fleche(i)\vy>0
        fleche(i)\inclinaison=180-Atan_en_degre(Int(-10* fleche(i)\vy/ fleche(i)\vx))
      ElseIf fleche(i)\vx<0 And  fleche(i)\vy<0
        fleche(i)\inclinaison=180+Atan_en_degre(Int(10* fleche(i)\vy/ fleche(i)\vx))
      ElseIf fleche(i)\vx>0 And  fleche(i)\vy<0
        fleche(i)\inclinaison=360-Atan_en_degre(Int(-10* fleche(i)\vy/ fleche(i)\vx))
      EndIf
      
      Start3D()
      RotateSprite3D(#spr_fleche,fleche(i)\inclinaison,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=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)) 
  StopDrawing() 
  
  Delay(1)
  FlipBuffers() 
ForEver

Publié : dim. 18/mai/2008 7:47
par Sehka
Salut,
Pour information, avec le nouveau code et avec 4000 flêches j'ai du 28 FPS ;)
A noter que c'est sur une carte 8800 GT et avec PB 4.20 Beta5.
@+

Publié : dim. 18/mai/2008 10:33
par Huitbit
@Sehka
Merci d'avoir testé la nouvelle version :P
Pour information, avec le nouveau code et avec 4000 flêches j'ai du 28 FPS
Et avec l'ancien code et 4000 flêches ?

Comme ça on pourrait comparer.
S'il y a une différence, en utilisant un tableau retournant des valeurs de -89° à +89°, on peut encore améliorer le code.

Avis aux testeurs(attention au débogueur!) qui n'ont pas une carte comme la mienne:

code 1:4000 flêches ; FPS = 9
code 2:4000 flêches ; FPS = 9


Avec des sprites plus fun, ça pourrait faire un screensaver digne de ce nom.

En fouinant sur le forum, j'ai vu qu'il suffisait de rajouter:
;pour le screensaver
Param.s = Left ( ProgramParameter (), 2)
If Param = "/p"
End
EndIf
Pour désactiver la prévisualisation lorsqu'on doit sélectionner l'écran de veille (ça marche sans ces trois lignes mais ça renvoie un écran noir inesthétique au moment du choix, alors juste pour trois lignes :roll: ...)
Puis de compiler avec l'extension .scr
Tout ça marche très bien :P

Par contre, d'autres personnes, utilisent des codes plus longs et plus compliqués.
Exemple : le super screensaver de kelebrindae
http://www.purebasic.fr/french/viewtopic.php?t=7945
Si quelqu'un est à l'aise (et a du temps libre :roll: ) dans ce genre de trucs(Callback, Mutex...etc), un tutorial "screensaver" ça serait cool !

Hasta la vista !

Publié : dim. 18/mai/2008 18:55
par Sehka
Huitbit a écrit : Et avec l'ancien code et 4000 flêches ?
Pour ton information j'ai toujours du 28 Fps.
@+

Comment récupérer le signe d'une valeur rapidement ?

Publié : lun. 19/mai/2008 3:09
par Huitbit
@Sehka
C'est donc ta machine qui assure, pas le code :lol: :lol:


Autre version (code 3) :
Comme vx et vy sont entiers, j'ai calculé un tableau plus complet :
Atan_en_degre.w(vx,vy,signe de vx,signe de vy)
C'est plus précis mais c'est pas encore ça :? (voir remarques)

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=1250
Structure fleche
  x.w
  y.w
  vx.w
  vy.w
  signevx.b
  signevy.b
  
EndStructure
;-pas du calcul
dt.b=1
;-initialisation
Dim Atan_en_degre.w(50,50,1,1)
For vx=-50 To 50
  If vx<>0
    For vy=-50 To 50
      If vx>0
        signevx=0
      Else 
        signevx=1
      EndIf
      If vy>0
        signevy=0
      Else 
        signevy=1
      EndIf
      Atan_en_degre(Int(Abs(vx)),Int(Abs(vy)),signevx,signevy)=Int(180*ATan(vy/vx)/#PI)+180*signevx
    Next vy
  EndIf
Next vx

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=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)
;-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
      
      If  fleche(i)\vx>0
        fleche(i)\signevx=0
      Else 
        fleche(i)\signevx=1
      EndIf
      If  fleche(i)\vy>=0
        fleche(i)\signevy=0
      Else 
        fleche(i)\signevy=1
      EndIf
      
      Start3D()
      RotateSprite3D(#spr_fleche,Atan_en_degre(Int(Abs(fleche(i)\vx)),Int(Abs(fleche(i)\vy)),fleche(i)\signevx,fleche(i)\signevy),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=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)) 
  StopDrawing() 
  
  Delay(1)
  FlipBuffers() 
ForEver

L'idéal serait de récupérer le signe de vx et de vy directement, parce que là, c'est un peu lourd !

Code : Tout sélectionner

 If  fleche(i)\vx>0
        fleche(i)\signevx=0
      Else 
        fleche(i)\signevx=1
      EndIf
      If  fleche(i)\vy>=0
        fleche(i)\signevy=0
      Else 
        fleche(i)\signevy=1
      EndIf
Idem :

Code : Tout sélectionner

 RotateSprite3D(#spr_fleche,Atan_en_degre(Int(Abs(fleche(i)\vx)),Int(Abs(fleche(i)\vy)),fleche(i)\signevx,fleche(i)\signevy),0)
vx et vy sont des entiers, dommage que leurs signes empêchent qu'ils soient utilisés directement dans le tableau car Int() et Abs() c'est lourd !

Hasta la vista !

Re: Comment récupérer le signe d'une valeur rapidement ?

Publié : lun. 19/mai/2008 5:53
par Backup
Huitbit a écrit : L'idéal serait de récupérer le signe de vx et de vy directement, parce que là, c'est un peu lourd !


; donne si le chiffre est positif ou negatif
Macro Sgn(Number)
    ((Number > 0 Or #False ) - (Number < 0 Or #True ))+1
EndMacro

Debug Sgn(-5)
Debug Sgn(-0)
Debug Sgn( 5)

Debug Sgn(-5.0)
Debug Sgn(-0.0)
Debug Sgn( 5.0)



renvoie 0 si negatif
renvoie 1 si positif

Code 4, plus propre !

Publié : lun. 19/mai/2008 5:55
par Huitbit
@Dobro
J'ai vu ta réponse après avoir posté
Merci quand même, mais j'ai fait une version sans tests de signes.

Je remplace le tableau Atan_en_degre() par un...

Poke...

Code : Tout sélectionner

PokeW(*MemoireID_Atan_en_degre +2*((vx+50)*100+vy+50), Int(180*ATan(vy/vx)/#PI)+180*signevx)
et puis Peek...

Code : Tout sélectionner

 RotateSprite3D(#spr_fleche,PeekW(*MemoireID_Atan_en_degre +2*((fleche(i)\vx+50)*100+fleche(i)\vy+50)),0)

Gain FPS : on sent un léger frémissement (peut-être une demi unité de FPS).
Gain clarté : plus de tests sur vx et vy :P

Code : Tout sélectionner

;trajectoires de projectiles
;auteur Huitbit
;pb v4.10
;*********************************
#largeur_ecran=1024
#hauteur_ecran=768
#spr_fleche=0
#x_fleche_initial=#largeur_ecran/2
#y_fleche_initial=#hauteur_ecran/2

;-nombre de flêches
n.w=1250
Structure fleche
  x.w
  y.w
  vx.w
  vy.w
EndStructure
;-pas du calcul
dt.b=1

;-initialisation
;-précalcul de l'arctangente
*MemoireID_Atan_en_degre = AllocateMemory(20500)
For vx=-50 To 50
  If vx<>0
    For vy=-50 To 50
      If vx>0
        signevx=0
      Else 
        signevx=1
      EndIf
      If vy>0
        signevy=0
      Else 
        signevy=1
      EndIf
      PokeW(*MemoireID_Atan_en_degre +2*((vx+50)*100+vy+50), Int(180*ATan(vy/vx)/#PI)+180*signevx)
    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)

;-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,PeekW(*MemoireID_Atan_en_degre +2*((fleche(i)\vx+50)*100+fleche(i)\vy+50)),0)
      DisplaySprite3D(#spr_fleche, fleche(i)\x, fleche(i)\y)
      Stop3D()
      
    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)) 
  StopDrawing() 
  
  Delay(1)
  FlipBuffers() 
ForEver
En tout cas la fonction Atan() de purebasic et efficace puisque le premier code obtient les mêmes résultats que les autres 8O

Hasta la vista !

Publié : lun. 19/mai/2008 6:16
par Backup
je viens de rechanger le code de sgn() au cas ou :)

Publié : lun. 19/mai/2008 6:20
par Backup
............

Publié : lun. 19/mai/2008 18:07
par Huitbit
@Dobro
Ca marche mieux comme ça :wink:

Code : Tout sélectionner

      fleche(i)\signevx=Sgn(-fleche(i)\vx) 
            fleche(i)\signevy=Sgn(-fleche(i)\vy) 
Le 0 et le 1 n'avaient pas la même signification.


Pas mal cette macro (un peu mystique mais pas mal :lol: :lol: :lol: )!

Hasta la vista !

Hooka hey!

Publié : mer. 21/mai/2008 6:26
par Huitbit
Hello,
En fait les sprite3D() bridaient tout !
Maintenant plus de comparaison possible avec les autres codes!

On ne peut pas utiliser usebuffer() avec les sprites3D() (c'est pas grave) alors je me suis débrouillé :P

Code : Tout sélectionner

;trajectoires de projectiles
;auteur Huitbit
;pb v4.10
;*********************************
#largeur_ecran=1024
#hauteur_ecran=768

;de 0 à 23, sprites de la flêche en rotation
#spr_fleche=24
#spr_fleche_complet=25

#x_fleche_initial=#largeur_ecran/2
#y_fleche_initial=#hauteur_ecran/2

;-nombre de flêches
n.w=4000

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()
GrabSprite(#spr_fleche_complet,0,0,768,32)
For i=0 To 23
  CreateSprite(i,32,32)
  UseBuffer(i)
  ClipSprite(#spr_fleche_complet,i*32,0,32,32)
  DisplaySprite(#spr_fleche_complet,0,0)
  UseBuffer(-1)
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
      
      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
Hasta la vista !

gloub

Publié : jeu. 22/mai/2008 8:34
par beauregard

Code : Tout sélectionner

;-précalcul du numéro du sprite à afficher
*MemoireID_numero_sprite = AllocateMemory(10200);
ah, je n'ai plus pied là :)

La version précédente, avec l'utilisation de sprites 3D, tu n'a pas pensé à faire un zoom progressif de celles-ci ? et une limitation du nombre des flêches ( n ?) à 16 par exemple, afin de privilégier, heu, la qualité à la quantité.

Code : Tout sélectionner

;Delay(1)