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)