Flêchistique(explosion du FPS voir dernier post)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Flêchistique(explosion du FPS voir dernier post)

Message 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
Dernière modification par Huitbit le mer. 21/mai/2008 6:32, modifié 4 fois.
Neosis
Messages : 113
Inscription : dim. 24/févr./2008 20:11

Message par Neosis »

ça m'intéresse beaucoup :)
je vais mettre ça dans mes archive perso, bien joué huitbit
:wink:
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

Pas mal du tout ;)
Bientôt le 14 juillet ? :D
Salutations,
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message 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.
@+
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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 !
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

Huitbit a écrit : Et avec l'ancien code et 4000 flêches ?
Pour ton information j'ai toujours du 28 Fps.
@+
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

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

Message 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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message 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
Dernière modification par Backup le lun. 19/mai/2008 6:15, modifié 5 fois.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Code 4, plus propre !

Message 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 !
Dernière modification par Huitbit le jeu. 22/mai/2008 11:47, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je viens de rechanger le code de sgn() au cas ou :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

............
Dernière modification par Backup le dim. 02/oct./2011 13:11, modifié 1 fois.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message 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 !
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Hooka hey!

Message 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 !
Dernière modification par Huitbit le jeu. 22/mai/2008 12:12, modifié 3 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

gloub

Message 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)
Répondre