Page 1 sur 1

problème starfield

Publié : jeu. 30/mars/2017 17:34
par raven
bonjour,

j'ai un petit soucis avec ce code(code du tuto ar-s/djes),j'ai un affichage d'étoile qui reste figé.
pourtant avec le 2éme code je n'ai pas ce soucis.je comprend pas ce qui ne va pas dans le 1er code surtout que c'est quasiment les codes.

j'ai testé avec la version de purebasic 5.60,5.50,5.44lts x86,mais je pense pas que ce soit un soucis de version de purebasic .
merci pour votre aide.

Code : Tout sélectionner

EnableExplicit

InitSprite()
InitKeyboard()

Enumeration 
  #etoile 
  #etoile2
  #etoile3
EndEnumeration

Enumeration fenetre
  #fenetre
EndEnumeration 

#largeur_ecran=800
#hauteur_ecran=600

#Nbstar=49

Structure etoile
  Xpos.i
  Ypos.i
  vitesse.i
  couleur.b
EndStructure

Global event,i,Letoiles,Hetoiles
Global Dim etoiles.etoile(#Nbstar) ;tableau

Letoiles = 520
Hetoiles = 170 

;--procedure etoiles--
Procedure dessine_star()
  CreateSprite(#etoile,1,1)
  CreateSprite(#etoile2,1,1)
  CreateSprite(#etoile3,1,1)
  StartDrawing(SpriteOutput(#etoile))
  Box(0,0,1,1,$CC99FF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile2))
  Box(0,0,1,1,$FFFF00)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile3))
  Box(0,0,1,1,$FF3399)
  StopDrawing()
  
EndProcedure


Procedure init_etoile()
  With etoiles(i)
    For i = 0 To #Nbstar
      \Xpos = Random(Letoiles,0)
      \Ypos = Random(Hetoiles,70)
      \vitesse=Random(4.2)
      \couleur=Random(2,0)
    Next
  EndWith
EndProcedure

Procedure affiche_etoile()
  For i=0 To #Nbstar
    DisplayTransparentSprite(etoiles(i)\couleur,etoiles(i)\Xpos,etoiles(i)\Ypos)
    
    etoiles(i)\Xpos-etoiles(i)\vitesse
    If etoiles(i)\Xpos<=150
      etoiles(i)\Xpos+Letoiles
    EndIf
  Next
EndProcedure

OpenWindow(#fenetre,0,0,#largeur_ecran,#hauteur_ecran,"test etoile",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#fenetre),0,0,#largeur_ecran,#hauteur_ecran)

dessine_star()
init_etoile()

Repeat
  Repeat
    
    event = WindowEvent()
    Select event 
      Case #PB_Event_CloseWindow
        End
    EndSelect
    
  Until event = 0
  
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
  
  affiche_etoile()
  
  ExamineKeyboard()
 
  
Until  KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End
2éme code:

Code : Tout sélectionner

EnableExplicit

InitSprite()
InitKeyboard()

Enumeration
  #etoile
  #etoile2
  #etoile3
EndEnumeration

Enumeration fenetre
  #fenetre
EndEnumeration 

#largeur_ecran = 800
#hauteur_ecran = 600
#NBR_star = 49


Structure Star
  X_star.i
  Y_star.i
  vitesse.i
  couleur.b
EndStructure

Global event,i,Lstar,Hstar
;--tableau etoile--
Global Dim stars.star(#NBR_star)

Lstar = 520
Hstar = 170

;--procedure etoiles--
Procedure dessine_star()
  CreateSprite(#etoile,1,1)
  CreateSprite(#etoile2,1,1)
  CreateSprite(#etoile3,1,1)
  StartDrawing(SpriteOutput(#etoile))
  Box(0,0,1,1,$00FFFF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile2))
  Box(0,0,1,1,$0033FF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile3))
  Box(0,0,1,1,$FFCC00)
  StopDrawing()
  
EndProcedure

Procedure initialisation()
  With stars(i)
    For i = 0 To #nbr_star
      \X_star = Random(Lstar,0)
      \Y_star = Random(Hstar,70)
      \vitesse= Random(4,2)
      \couleur = Random(2,0)
    Next
  EndWith
EndProcedure

Procedure affiche_star()
  For i= 0 To #nbr_star
    DisplayTransparentSprite(stars(i)\couleur,stars(i)\X_star,stars(i)\Y_star)
    stars(i)\X_star - stars(i)\vitesse
    If stars(i)\X_star < = 150
      stars(i)\X_star + Lstar
    EndIf
  Next
EndProcedure

OpenWindow(#fenetre,0,0,#largeur_ecran,#hauteur_ecran,"test etoile",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#fenetre),0,0,#largeur_ecran,#hauteur_ecran)

dessine_star()

initialisation()

Repeat 
  Repeat 
    
    event = WindowEvent()
    Select event
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until event = 0
  
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
  affiche_star()
   
  ExamineKeyboard()
  
Until  KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End

Re: problème starfield

Publié : jeu. 30/mars/2017 18:43
par SPH
Ligne 59 :

Code : Tout sélectionner

      \vitesse=Random(4.2)
Ce n'est pas un point 8)

Re: problème starfield

Publié : jeu. 30/mars/2017 19:01
par djes
Tiens, une petite astuce pour éviter que deux étoiles ne soient trop proches...

Code : Tout sélectionner

Procedure init_etoile()
  With etoiles(i)
    For i = 0 To #Nbstar
      \Xpos = i*Letoiles / #Nbstar
      \Ypos = 70 + i*Hetoiles / #Nbstar
      \vitesse=Random(4,2)
      \couleur=Random(2,0)
    Next
    For i = 0 To #Nbstar*5
      Swap etoiles(Random(#Nbstar))\Xpos, etoiles(Random(#Nbstar))\Xpos
      Swap etoiles(Random(#Nbstar))\Ypos, etoiles(Random(#Nbstar))\Ypos
    Next i
  EndWith
EndProcedure

Re: problème starfield

Publié : ven. 31/mars/2017 19:33
par raven
sph bien vu et merci 8)

merci pour l'astuce djes,en effet il y a plus d'espace entre les étoiles.
la commande swap permet de permuter une variable,une list,tableau d'après ce que j'ai vu dans la doc.

c'est encore brouillon pour moi,d'après ce que j'ai compris dans ton exemple:

Code : Tout sélectionner

      Swap etoiles(Random(#Nbstar))\Xpos, etoiles(Random(#Nbstar))\Xpos;valeur 1,valeur 2
      Swap etoiles(Random(#Nbstar))\Ypos, etoiles(Random(#Nbstar))\Ypos;valeur 1,valeur 2