problème starfield

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

problème starfield

Message 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
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: problème starfield

Message par SPH »

Ligne 59 :

Code : Tout sélectionner

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: problème starfield

Message 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
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: problème starfield

Message 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
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Répondre