Vive les étoiles

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Vive les étoiles

Message par Le Soldat Inconnu »

Salut,

un petit code tout bête, enfin tout bête, façon de parler ... qui permet d'avoir des étoiles qui défilent sur l'écran.

c'est les bidouilles actuelles de mister Crystal noir qui m'ont donné envie de faire une démo, ceci est le premier palier.

Pour ceux qui recherchent des exemples sur les listes chainées, mon code les utilise (base de données des étoiles)
il y a aussi une partie sur un effet visuel qui permet d'avoir une étoile qui grossit en jouant sur un carré de 9 point dont je modifie la couleur.

donc, pour le code, vous avez les flèches qui permettent de tripoter les param Vitesse et Nb d'ajout affichés en haut à gauche.

Code : Tout sélectionner

ProcedureDLL.l ColorLuminosity2(Couleur, Echelle.f) ; Eclaicir ou foncer une couleur
  Protected Rouge, Vert, Bleu
  
  Rouge = Red(Couleur) * Echelle
  Vert = Green(Couleur) * Echelle
  Bleu = Blue(Couleur) * Echelle
  
  If Rouge > 255 : Rouge = 255 : EndIf
  If Vert > 255 : Vert = 255 : EndIf
  If Bleu > 255 : Bleu = 255 : EndIf
  
  ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure



Structure InfoEtoile
  x.l
  y.l
  z.l
  Couleur.l
EndStructure

NewList Etoile.InfoEtoile()

#Ecran_Largeur = 1024
#Ecran_Hauteur = 768

#EffetPerspective = #Ecran_Largeur * 2 / 3


NbAjoutEtoile = 25
#ProfondeurDefautEtoile = 5
Vitesse = 21


; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

If OpenScreen(#Ecran_Largeur, #Ecran_Hauteur, 32, "Etoiles") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

Repeat
  ClearScreen(0, 0, 0)
  
  ; On lit les évènements clavier et souris
  ExamineKeyboard()
  
  ; On crée des étoiles
  ResetList(Etoile())
  For n = 1 To NbAjoutEtoile
    AddElement(Etoile())
    Etoile()\x = Random(#Ecran_Largeur * #ProfondeurDefautEtoile) - #Ecran_Largeur * #ProfondeurDefautEtoile / 2
    Etoile()\y = Random(#Ecran_Hauteur * #ProfondeurDefautEtoile) - #Ecran_Hauteur * #ProfondeurDefautEtoile / 2
    If Abs(Etoile()\x) <= 2 And Abs(Etoile()\y) <= 2
      DeleteElement(Etoile())
    Else
      Etoile()\Couleur = $FCE8CB ; Bleu
      Etoile()\z = #ProfondeurDefautEtoile * #EffetPerspective
    EndIf
  Next
  
  ; On déplace les étoiles
  StartDrawing(ScreenOutput())
    ResetList(Etoile())
    While NextElement(Etoile())
      Etoile()\z - Vitesse
      Temp.f = #EffetPerspective / Etoile()\z
      If Etoile()\z <= 0 ; Si l'étoile est sorti de l'écran en Z
        DeleteElement(Etoile())
      Else
        x2 = Etoile()\x * Temp + #Ecran_Largeur / 2 ; Coordonnée de l'étoile
        y2 = Etoile()\y * Temp + #Ecran_Hauteur / 2
        If x2 <= 0 Or x2 >= #Ecran_Largeur - 1 Or y2 <= 0 Or y2 >= #Ecran_Hauteur - 1 ; Si on sort de l'écran, on supprime l'étoile
          DeleteElement(Etoile())
        Else ; Sinon, on affiche l'étoile
          
          ; Centre
          Plot(x2, y2, ColorLuminosity2(Etoile()\Couleur, Temp * 1.5))
          ; Cotés
          Temp * 0.4
          Plot(x2 - 1, y2, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2 + 1, y2, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          ; Diagonales
          Temp * 0.6
          Plot(x2 - 1, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2 + 1, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2 - 1, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          Plot(x2 + 1, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          
        EndIf
      EndIf
    Wend
    
    
    ; Calcul du FPS
    #DefinitionFPS = 20
    cpt + 1
    If cpt = #DefinitionFPS
      cpt = 0
      fps.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps)
      Temps = ElapsedMilliseconds()
    EndIf
    FrontColor(0, 0, 0)
    Locate(0, 5)
    DrawText("FPS = " + StrF(fps, 1))
    Locate(0, 20)
    DrawText("Etoiles = " + Str(CountList(Etoile())))
    Locate(0, 35)
    DrawText("Vitesse = " + Str(Vitesse))
    Locate(0, 50)
    DrawText("Ajout = " + Str(NbAjoutEtoile))
    
  StopDrawing()
  
  FlipBuffers()
  
  If IsScreenActive() = 0
    End
  EndIf
  
  If KeyboardReleased(#PB_Key_Up)
    Vitesse + 5
  EndIf
  If KeyboardReleased(#PB_Key_Down) And Vitesse > 5
    Vitesse - 5
  EndIf
  If KeyboardReleased(#PB_Key_Right)
    NbAjoutEtoile + 5
  EndIf
  If KeyboardReleased(#PB_Key_Left) And NbAjoutEtoile > 1
    NbAjoutEtoile - 5
  EndIf
  
Until KeyboardPushed(#PB_Key_Escape)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

sympa la démo :) joli Starfield :) sympa pour faire du demomaking :)

je retourne bidouiller tiens :p
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Super LSI mais moi de toute façon je n'arrive pas à comprendre les liste chainer ( J'ai jamais compri ) .
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

et garzul, regardes mon tuto sur le fond étoilé, ya une bonne explication sur les listes chainées je pense.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

garzul a écrit :Super LSI mais moi de toute façon je n'arrive pas à comprendre les liste chainer ( J'ai jamais compri ) .
Il va bien falloir que tu comprenne, même si on doit prendre un marteau pour tout faire entrer dans ta tête :mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

vous m'avez deja defoncé la tronche avec un marteau
pour les structures , et c'est limite ! :lol: (chpeut pas lacher mes tableaux ) :?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dobro a écrit :vous m'avez deja defoncé la tronche avec un marteau
pour les structures , et c'est limite ! :lol: (chpeut pas lacher mes tableaux ) :?
J'ai un marteau à 2 têtes ...
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Bah moi j'essaye de comprendre avec le tuts de crystal noir :) PS : Pour le marteau je préfere le Burin sa fait plus mal mais sa rentrera d'un coup :lol:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

vraiment superbe !! :P
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

8O Beau boulot..... vraiment ça me trou le c... !!!!!!

Dis, tu veux pas échanger ton cerveau contre le mien ?
Un an que je touche à PB et je suis toujours aussi nul !!!!!

Et le pire dans tout ça, c'est que j'adore PB !!!
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Le principe est pourtant super simple :

Première chose, toutes les positions sont relatives au centre de l'écran.

La position de l'étoile :
bon il faut faire croire à de la 3D.
La première étape consite à positionner l'étoile en x, y aléatoirement.
cette position est celle de l'étoile que l'on affiche sur un plan 2D tout bête donc en z = 0
ensuite, je fais apparaitre les étoiles à une certaine profondeur z = 1000 par exemple
quand un objet est loin, la distance sont plus petite (c'est idiot mais c'est ça le principe de la 3D que j'utilise ici)
donc plus l'étoile est loin en Z et plus je diminue les coordonnées X, Y de l'étoile

Code : Tout sélectionner

X_Etoile_3D = X_Etoile * Facteur / Z_etoile
Y_Etoile_3D = Y_Etoile * Facteur / Z_etoile
Le facteur permet de réguler l'effet de 3D

Ensuite, dans le code, il sufit de diminuer le Z et de recalculer la position et de l'afficher

La liste chainée :
Elle me sert à stocker la position de chaque étoile.

A chaque tour de boucle, je crée des étoiles.
Ces étoiles sont stockées dans la liste chainée à l'aide d'une struture (x, y, z et couleur de l'étoile)

ensuite pour chaque étoile contenu dans la liste, je la fait évoluer en Z
et quand l'étoile sort de l'écran, je l'enlève de la liste

Grossiement de l'étoile :
Mon étoile est constitué de 9 points

***
***
***

l'intensité lumineuse des points varie avec la distance Z de l'étoile
le centre est le plus claire, ensuite vient les points cardianaux plus foncé que le centre puis les point sur les diagonales encore plus foncé que le centre.
donc plus l'étoile est proche et plus le contour de l'étoile s'éclaircie.
on obtient un étoile qui grossit.

Et voilà, le code est expliquée de A à Z :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

une petite optimisation

Code : Tout sélectionner

ProcedureDLL.l ColorLuminosity2(Couleur, Echelle.f) ; Eclaicir ou foncer une couleur
  Protected Rouge, Vert, Bleu
  
  Rouge = Red(Couleur) * Echelle
  Vert = Green(Couleur) * Echelle
  Bleu = Blue(Couleur) * Echelle
  
  If Rouge > 255 : Rouge = 255 : EndIf
  If Vert > 255 : Vert = 255 : EndIf
  If Bleu > 255 : Bleu = 255 : EndIf
  
  ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure



Structure InfoEtoile
  x.l
  y.l
  z.l
  Couleur.l
EndStructure

NewList Etoile.InfoEtoile()

#Ecran_Largeur = 1024
#Ecran_Hauteur = 768

#EffetPerspective = #Ecran_Largeur * 2 / 3


NbAjoutEtoile = 25
#ProfondeurDefautEtoile = 8
Vitesse = 21


; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

If OpenScreen(#Ecran_Largeur, #Ecran_Hauteur, 32, "Etoiles") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

Repeat
  ClearScreen(0, 0, 0)
  
  ; On lit les évènements clavier et souris
  ExamineKeyboard()
  
  ; On crée des étoiles
  ResetList(Etoile())
  For n = 1 To NbAjoutEtoile
    AddElement(Etoile())
    Etoile()\x = Random(#Ecran_Largeur * #ProfondeurDefautEtoile) - #Ecran_Largeur * #ProfondeurDefautEtoile / 2
    Etoile()\y = Random(#Ecran_Hauteur * #ProfondeurDefautEtoile) - #Ecran_Hauteur * #ProfondeurDefautEtoile / 2
    If Etoile()\x = 0 Or Etoile()\y = 0
      DeleteElement(Etoile())
    Else
      Etoile()\Couleur = $FCE8CB ; Bleu
      Etoile()\z = #ProfondeurDefautEtoile * #EffetPerspective
    EndIf
  Next
  
  ; On déplace les étoiles
  StartDrawing(ScreenOutput())
    ResetList(Etoile())
    While NextElement(Etoile())
      Etoile()\z - Vitesse
      Temp.f = #EffetPerspective / Etoile()\z
      If Etoile()\z <= 0 ; Si l'étoile est sorti de l'écran en Z
        DeleteElement(Etoile())
      Else
        x2 = Etoile()\x * Temp + #Ecran_Largeur / 2 ; Coordonnée de l'étoile
        y2 = Etoile()\y * Temp + #Ecran_Hauteur / 2
        If x2 <= 0 Or x2 >= #Ecran_Largeur - 1 Or y2 <= 0 Or y2 >= #Ecran_Hauteur - 1 ; Si on sort de l'écran, on supprime l'étoile
          DeleteElement(Etoile())
        Else ; Sinon, on affiche l'étoile
          
          ; Centre
          Plot(x2, y2, ColorLuminosity2(Etoile()\Couleur, Temp * 1.5))
          If Temp > 0.2
            ; Cotés
            Temp * 0.4
            Plot(x2 - 1, y2, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2 + 1, y2, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
            ; Diagonales
            Temp * 0.6
            Plot(x2 - 1, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2 + 1, y2 - 1, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2 - 1, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
            Plot(x2 + 1, y2 + 1, ColorLuminosity2(Etoile()\Couleur, Temp))
          EndIf
        EndIf
      EndIf
    Wend
    
    
    ; Calcul du FPS
    #DefinitionFPS = 20
    cpt + 1
    If cpt = #DefinitionFPS
      cpt = 0
      fps.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps)
      Temps = ElapsedMilliseconds()
    EndIf
    FrontColor(0, 0, 0)
    Locate(0, 5)
    DrawText("FPS = " + StrF(fps, 1))
    Locate(0, 20)
    DrawText("Etoiles = " + Str(CountList(Etoile())))
    Locate(0, 35)
    DrawText("Vitesse = " + Str(Vitesse))
    Locate(0, 50)
    DrawText("Ajout = " + Str(NbAjoutEtoile))
    
  StopDrawing()
  
  FlipBuffers()
  
  If IsScreenActive() = 0
    End
  EndIf
  
  If KeyboardReleased(#PB_Key_Up)
    Vitesse + 5
  EndIf
  If KeyboardReleased(#PB_Key_Down) And Vitesse > 5
    Vitesse - 5
  EndIf
  If KeyboardReleased(#PB_Key_Right)
    NbAjoutEtoile + 5
  EndIf
  If KeyboardReleased(#PB_Key_Left) And NbAjoutEtoile > 1
    NbAjoutEtoile - 5
  EndIf
  
Until KeyboardPushed(#PB_Key_Escape)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre