Re: Pour les fous de graphisme...la spirale infernale
Publié : mar. 08/déc./2009 19:23
J'ai essayé qques trucs sous pb4.30, rien trouvé désolé.
Forums PureBasic - Français
https://www.purebasic.fr/french/
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.40
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
#FL = 300 ; Taille de la fenêtre
#FH = 300
#Tx = 150 ; Centre de la tornade
#Ty = 150
#Tr = 120 ; Rayon de la tornade
#Td = 20 ; Dispersion des points de la tornade
#Tmin = 20 ; Rayon minimum de la tornade
Structure ElementTornade
x.f ; Position réelle
y.f
xd.i ; Position pour le dessin
yd.i
vx.f ; Vitesse
vy.f
Vie.i ; Durée de vie
EndStructure
Global NewList Tornade.ElementTornade()
Structure GraviteInfo
ax.f ; Accélération
ay.f
d.f ; Distance
Couleur.i
EndStructure
Global Dim Gravite.GraviteInfo(#FL, #FH)
; Pré calcul de la gravité qui va permettre de générer la tornade
For x = 0 To #FL - 1
For y = 0 To #FH - 1
dx = #Tx - x
dy = #Ty - y
Gravite(x, y)\d.f = Sqr(dx * dx + dy * dy)
If Gravite(x, y)\d > 0
Gravite(x, y)\ax = dx / Gravite(x, y)\d / Gravite(x, y)\d
Gravite(x, y)\ay = dy / Gravite(x, y)\d / Gravite(x, y)\d
Gravite(x, y)\Couleur = (255 + #Tmin * 2) * Sqr(Gravite(x, y)\d / #Tr) - #Tmin * 2
If Gravite(x, y)\Couleur > 255
Gravite(x, y)\Couleur = 255
ElseIf Gravite(x, y)\Couleur < 0
Gravite(x, y)\Couleur = 0
EndIf
Gravite(x, y)\Couleur = RGB(Gravite(x, y)\Couleur, Gravite(x, y)\Couleur, Gravite(x, y)\Couleur)
EndIf
Next
Next
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, #FL, #FH, "Tornade", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
If InitSprite() = 0
End
EndIf
If OpenWindowedScreen(WindowID(0), 0, 0, #FL, #FH, 1, 0, 0, #PB_Screen_WaitSynchronization) = 0
End
EndIf
CreateSprite(0, #FL, #FH)
StartDrawing(SpriteOutput(0))
For x = 0 To #FL - 1
For y = 0 To #FH - 1
Plot(x, y, Gravite(x, y)\Couleur)
Next
Next
StopDrawing()
AddWindowTimer(0, 0, 40)
Repeat
Repeat
Event = WaitWindowEvent(1)
Select Event
Case #PB_Event_Timer
If EventTimer() = 0
AddElement(Tornade())
Tornade()\x = #Tx
Tornade()\y = #Ty - #Tr - #Td + Random(#Td * 2)
Tornade()\xd = Tornade()\x
Tornade()\yd = Tornade()\y
Tornade()\vx = 1
AddElement(Tornade())
Tornade()\x = #Tx
Tornade()\y = #Ty + #Tr - #Td + Random(#Td * 2)
Tornade()\xd = Tornade()\x
Tornade()\yd = Tornade()\y
Tornade()\vx = -1
AddElement(Tornade())
Tornade()\x = #Tx + #Tr - #Td + Random(#Td * 2)
Tornade()\y = #Ty
Tornade()\xd = Tornade()\x
Tornade()\yd = Tornade()\y
Tornade()\vy = 1
AddElement(Tornade())
Tornade()\x = #Tx - #Tr - #Td + Random(#Td * 2)
Tornade()\y = #Ty
Tornade()\xd = Tornade()\x
Tornade()\yd = Tornade()\y
Tornade()\vy = -1
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow Or Event = 0
ClearScreen(0)
DisplaySprite(0, 0, 0)
StartDrawing(ScreenOutput())
ForEach Tornade()
Tornade()\vx + Gravite(Tornade()\xd, Tornade()\yd)\ax
Tornade()\vy + Gravite(Tornade()\xd, Tornade()\yd)\ay
Tornade()\vx * 0.999
Tornade()\vy * 0.999
Tornade()\x + Tornade()\vx
Tornade()\y + Tornade()\vy
Tornade()\xd = Tornade()\x
Tornade()\yd = Tornade()\y
If Gravite(Tornade()\xd, Tornade()\yd)\d < #Tmin
DeleteElement(Tornade())
EndIf
Next
ForEach Tornade()
Circle(Tornade()\xd, Tornade()\yd, 3, Gravite(Tornade()\xd, Tornade()\yd)\Couleur)
Next
DrawText(0, 0, Str(ListSize(Tornade())), $00FF00, 0)
StopDrawing()
FlipBuffers()
Until Event = #PB_Event_CloseWindow
RemoveWindowTimer(0, 0)
Code : Tout sélectionner
If InitSprite() = 0 Or InitSprite3D()=0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
End
EndIf
If OpenWindow(0, 0, 0, 240, 240, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 170, 135, 45, 20, "Quitter")
If OpenWindowedScreen(WindowID(0), 0, 0, 240, 240, 0, 0, 0)
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
size=Sqr(240*240+240*240)
CreateImage(0, size * 2, size * 2, 24)
NbBras = 3
EpaisseurBras = 16
If StartDrawing(ImageOutput(0))
For x = 0 To size * 2 - 1
For y = 0 To size * 2 - 1
dx.f = x - size
dy.f = y - size
d.f = Sqr(dx * dx + dy * dy)
angle.f = ACos(dx / d)
If dy < 0
angle = 2 * #PI - angle
EndIf
position = Round(d / EpaisseurBras - NbBras * angle / #PI, #PB_Round_Nearest)
If position & %1 ; si position est paire
Plot(x, y, $FFFFFF)
EndIf
Next
Next
StopDrawing()
ResizeImage(0, size, size)
CreateSprite(0, size, size,#PB_Sprite_Texture)
If StartDrawing(SpriteOutput(0))
DrawImage(ImageID(0), 0, 0)
StopDrawing()
FreeImage(0)
CreateSprite3D(0,0)
EndIf
EndIf
Else
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
Repeat
Repeat
Event = WaitWindowEvent(1)
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
ClearScreen(0)
Start3D()
RotateSprite3D(0,ElapsedMilliseconds()/5,0)
DisplaySprite3D(0, (240-size)/2, (240-size)/2)
Stop3D()
FlipBuffers()
ForEver
Code : Tout sélectionner
If InitSprite() = 0 Or InitSprite3D()=0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
End
EndIf
If OpenWindow(0, 0, 0, 240, 240, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 170, 135, 45, 20, "Quitter")
If OpenWindowedScreen(WindowID(0), 0, 0, 240, 240, 0, 0, 0)
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
size=Sqr(240*240+240*240)
CreateImage(0, size * 2, size * 2, 24)
NbBras = 3
EpaisseurBras = 16
If StartDrawing(ImageOutput(0))
For x = 0 To size * 2 - 1
For y = 0 To size * 2 - 1
dx.f = x - size
dy.f = y - size
d.f = Sqr(dx * dx + dy * dy)
angle.f = ACos(dx / d)
If dy < 0
angle = 2 * #PI - angle
EndIf
position = Round(d / EpaisseurBras - NbBras * angle / #PI, #PB_Round_Nearest)
If position & %1 ; si position est paire
Plot(x, y, $FFFFFF)
EndIf
Next
Next
StopDrawing()
ResizeImage(0, size, size)
CreateSprite(0, size, size,#PB_Sprite_Texture)
If StartDrawing(SpriteOutput(0))
DrawImage(ImageID(0), 0, 0)
StopDrawing()
FreeImage(0)
CreateSprite3D(0,0)
EndIf
EndIf
Else
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
Repeat
Repeat
Event = WaitWindowEvent(1)
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
ClearScreen(0)
Start3D()
RotateSprite3D(0,ElapsedMilliseconds()/5,0)
DisplaySprite3D(0, (240-size)/2, (240-size)/2)
Stop3D()
FlipBuffers()
ForEver