Page 1 sur 1

Vive les étoiles

Publié : sam. 23/oct./2004 13:29
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)

Publié : sam. 23/oct./2004 13:30
par Crystal Noir
sympa la démo :) joli Starfield :) sympa pour faire du demomaking :)

je retourne bidouiller tiens :p

Publié : sam. 23/oct./2004 13:53
par garzul
Super LSI mais moi de toute façon je n'arrive pas à comprendre les liste chainer ( J'ai jamais compri ) .

Publié : sam. 23/oct./2004 14:40
par Crystal Noir
et garzul, regardes mon tuto sur le fond étoilé, ya une bonne explication sur les listes chainées je pense.

Publié : sam. 23/oct./2004 15:19
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:

Publié : sam. 23/oct./2004 15:29
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 ) :?

Publié : sam. 23/oct./2004 15:31
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 ...

Publié : sam. 23/oct./2004 15:46
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:

Publié : sam. 23/oct./2004 16:04
par Thyphoon
vraiment superbe !! :P

Publié : sam. 23/oct./2004 18:07
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 !!!

Publié : sam. 23/oct./2004 18:40
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:

Publié : sam. 23/oct./2004 19:24
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)