Re: Pour les fous de graphisme...la spirale infernale [résolu]
Publié : ven. 27/nov./2009 16:45
Il va adorer 

Forums PureBasic - Français
https://www.purebasic.fr/french/
+1 c'est un dou-dingue !!Dobro a écrit :![]()
il est dingue ! je le savais , il est dingue !
Code : Tout sélectionner
; Code créé par NETMAESTRO et TYPHOON réuni pas KCC
Enumeration
#FenetreAnneau
#FenetreSpirale
#ImageAnneau
#Sprite3D
#Sprite2D
EndEnumeration
Global HwndSpirale.l,HwndAnneau.l
Global HwndAnneau, hBrush, Region, Size
Image = LoadImage(#ImageAnneau, "AnneauOr.bmp")
Procedure CallBack(WND,Message,lParam,wParam)
Result = #PB_ProcessPureBasicEvents
Select WND
Case HwndAnneau
If Message = #WM_MOVE
ResizeWindow(#FenetreSpirale, WindowX(#FenetreAnneau) + 25, WindowY(#FenetreAnneau) + 25, #PB_Ignore, #PB_Ignore)
ElseIf Message = #WM_LBUTTONDOWN
SendMessage_(WindowID(#FenetreAnneau), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
Procedure GrabRegion(ImageID, TransColor) ; HBITMAP ImageID, COLORREF transcolor
;===============================================
; =
; Very fast bitmap -> region creator =
; By netmaestro =
; Contributors: eesau, nico, flype =
; June 26, 2007 =
; =
; *** IMPORTANT *** =
; =
; transcolor must be in BGR format =
; =
;===============================================
Structure RECTARRAY
rect.RECT[0]
EndStructure
GetObject_(ImageID, SizeOf(BITMAP), @bmp.BITMAP)
Protected width = bmp\bmWidth
Protected height = bmp\bmHeight
Protected hVisibleRgn = CreateRectRgn_(0, 0, width, height)
BmiInfo.BITMAPINFOHEADER
With BmiInfo
\biSize = SizeOf(BITMAPINFOHEADER)
\biWidth = width
\biHeight = -height
\biPlanes = 1
\biBitCount = 32
\biCompression = #BI_RGB
EndWith
rowbytes = SizeOf(LONG)*width
*ColorBits = AllocateMemory(rowbytes*height)
hDC = GetWindowDC_(#Null)
iRes = GetDIBits_(hDC, ImageID, 0, height, *ColorBits, @bmiInfo, #DIB_RGB_COLORS)
ReleaseDC_(#Null, hDC)
Structure_Max=(width*height*16)+SizeOf(RGNDATAHEADER)
*Buffer.RGNDATAHEADER=AllocateMemory(Structure_Max)
*rd.RECTARRAY=*Buffer+SizeOf(RGNDATAHEADER)
rectcount = 0
For y=0 To height-1
pxcount=0
For x=0 To rowbytes-1 Step 4
*px.LONG = *ColorBits + rowbytes * y + x
If *px\l = transcolor
transcount = 1 : firsttrans = pxcount
x+SizeOf(LONG) : *px.LONG = *ColorBits + rowbytes * y + x
While *px\l = transcolor And x <= rowbytes-1
transcount+1 : pxcount+1 : x+SizeOf(LONG)
*px = *ColorBits + rowbytes * y + x
Wend
x-SizeOf(LONG) : *px.LONG = *ColorBits + rowbytes * y + x
*rd\rect[rectcount]\left = firsttrans
*rd\rect[rectcount]\top = y
*rd\rect[rectcount]\right = firsttrans+transcount
*rd\rect[rectcount]\bottom = y+1
rectcount+1
EndIf
pxcount+1
Next
Next
With *Buffer
\dwSize = SizeOf(RGNDATAHEADER)
\iType = #RDH_RECTANGLES
\nCount = rectcount
\nRgnSize = rectcount * SizeOf(RECT)
\rcBound\left = 0
\rcBound\top = 0
\rcBound\right = width
\rcBound\bottom = height
EndWith
RegionSize=SizeOf(RGNDATAHEADER)+(rectcount * SizeOf(RECT))
hTransparentRgn = ExtCreateRegion_(0, RegionSize, *Buffer)
CombineRgn_(hVisibleRgn, hVisibleRgn, hTransparentRgn, #RGN_XOR)
FreeMemory(*Buffer)
FreeMemory(*ColorBits)
DeleteObject_(hTransparentRgn)
ProcedureReturn hVisibleRgn
EndProcedure
Procedure FenetreSpirale()
If InitSprite() = 0 Or InitSprite3D() = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran et l'environnement nécessaire aux sprites !")
End
EndIf
If OpenWindow(#FenetreSpirale, 0, 0, 240, 240, "", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
Region = CreateEllipticRgn_(0, 0, WindowWidth(#FenetreSpirale), WindowHeight(#FenetreSpirale))
SetWindowRgn_(WindowID(#FenetreSpirale), Region, #True)
DeleteObject_(Region)
SetWindowCallback(@CallBack())
If OpenWindowedScreen(WindowID(#FenetreSpirale), 0, 0, 240, 240, 0, 0, 0)
Size = Sqr(240 * 240 + 240 * 240)
CreateSprite(#Sprite2D, Size, Size, #PB_Sprite_Texture)
If StartDrawing(SpriteOutput(#Sprite2D))
For z = 0 To 2800
x = Cos(z * #PI / 180) * z / 15
y = Sin(z * #PI / 180) * z / 15
Circle(Size / 2 + x, Size / 2 + y, 1 + z / 250, RGB(255,255,255))
Next
StopDrawing()
CreateSprite3D(#Sprite3D, #Sprite2D)
EndIf
Delay(100)
hBrush = CreatePatternBrush_(ImageID(#ImageAnneau))
HwndAnneau = OpenWindow(#FenetreAnneau, WindowX(#FenetreSpirale), WindowY(#FenetreSpirale), ImageWidth(#ImageAnneau), ImageHeight(#ImageAnneau), "",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
SetClassLongPtr_(WindowID(#FenetreAnneau), #GCL_HBRBACKGROUND, hBrush)
SetWindowRgn_(WindowID(#FenetreAnneau), GrabRegion(ImageID(#ImageAnneau), RGB(255,255,255)), #True)
SetWindowLong_(WindowID(#FenetreAnneau), #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ; Cacher de la barre des taches
StickyWindow(#FenetreAnneau, #True)
HideWindow(#FenetreAnneau, #False)
Delay(100)
Else
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
EndProcedure
FenetreSpirale()
Repeat
Evenement = WaitWindowEvent(1)
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
Start3D()
RotateSprite3D(#Sprite3D, ElapsedMilliseconds() / 5, 0)
DisplaySprite3D(#Sprite3D, (240 - Size) / 2, (240 - Size) / 2)
Stop3D()
Until GetAsyncKeyState_(#VK_ESCAPE)
Code : Tout sélectionner
; Code créé par NETMAESTRO et TYPHOON réuni pas KCC
Enumeration
#FenetreAnneau
#FenetreSpirale
#ImageAnneau
#Sprite3D
#Sprite2D
EndEnumeration
Global HwndSpirale.l,HwndAnneau.l
Global HwndAnneau,hBrush,Region,Size
Image=LoadImage(#ImageAnneau,"L:\program files\PB440\PB440\AnneauOr.bmp"); <= à changer suivant votre chemin *************************************
; Debug image
Procedure CallBack(WND,Message,lParam,wParam)
Result=#PB_ProcessPureBasicEvents
Select WND
Case HwndAnneau
If Message=#WM_MOVE
ResizeWindow(#FenetreSpirale,WindowX(#FenetreAnneau)+25,WindowY(#FenetreAnneau)+25,#PB_Ignore,#PB_Ignore)
ElseIf Message=#WM_LBUTTONDOWN
SendMessage_(WindowID(#FenetreAnneau),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
Procedure GrabRegion(ImageID,TransColor) ; HBITMAP ImageID, COLORREF transcolor
;===============================================
; =
; Very fast bitmap -> region creator =
; By netmaestro =
; Contributors: eesau, nico, flype =
; June 26, 2007 =
; =
; *** IMPORTANT *** =
; =
; transcolor must be in BGR format =
; =
;===============================================
Structure RECTARRAY
rect.RECT[0]
EndStructure
GetObject_(ImageID,SizeOf(BITMAP),@bmp.BITMAP)
Protected width=bmp\bmWidth
Protected height=bmp\bmHeight
Protected hVisibleRgn=CreateRectRgn_(0,0,width,height)
BmiInfo.BITMAPINFOHEADER
With BmiInfo
\biSize=SizeOf(BITMAPINFOHEADER)
\biWidth=width
\biHeight=-height
\biPlanes=1
\biBitCount=32
\biCompression=#BI_RGB
EndWith
rowbytes=SizeOf(LONG)*width
*ColorBits=AllocateMemory(rowbytes*height)
hDC=GetWindowDC_(#Null)
iRes=GetDIBits_(hDC,ImageID,0,height,*ColorBits,@bmiInfo,#DIB_RGB_COLORS)
ReleaseDC_(#Null,hDC)
Structure_Max=(width*height*16)+SizeOf(RGNDATAHEADER)
*Buffer.RGNDATAHEADER=AllocateMemory(Structure_Max)
*rd.RECTARRAY=*Buffer+SizeOf(RGNDATAHEADER)
rectcount=0
For y=0 To height-1
pxcount=0
For x=0 To rowbytes-1 Step 4
*px.LONG=*ColorBits+rowbytes*y+x
If *px\l=transcolor
transcount=1:firsttrans=pxcount
x+SizeOf(LONG) :*px.LONG=*ColorBits+rowbytes*y+x
While *px\l=transcolor And x<=rowbytes-1
transcount+1:pxcount+1:x+SizeOf(LONG)
*px=*ColorBits+rowbytes*y+x
Wend
x-SizeOf(LONG) :*px.LONG=*ColorBits+rowbytes*y+x
*rd\rect[rectcount]\left=firsttrans
*rd\rect[rectcount]\top=y
*rd\rect[rectcount]\right=firsttrans+transcount
*rd\rect[rectcount]\bottom=y+1
rectcount+1
EndIf
pxcount+1
Next
Next
With *Buffer
\dwSize=SizeOf(RGNDATAHEADER)
\iType=#RDH_RECTANGLES
\nCount=rectcount
\nRgnSize=rectcount*SizeOf(RECT)
\rcBound\left=0
\rcBound\top=0
\rcBound\right=width
\rcBound\bottom=height
EndWith
RegionSize=SizeOf(RGNDATAHEADER)+(rectcount*SizeOf(RECT))
hTransparentRgn=ExtCreateRegion_(0,RegionSize,*Buffer)
CombineRgn_(hVisibleRgn,hVisibleRgn,hTransparentRgn,#RGN_XOR)
FreeMemory(*Buffer)
FreeMemory(*ColorBits)
DeleteObject_(hTransparentRgn)
ProcedureReturn hVisibleRgn
EndProcedure
Procedure FenetreSpirale()
If InitSprite()=0 Or InitSprite3D()=0
MessageRequester("Erreur","Impossible d'ouvrir l'écran et l'environnement nécessaire aux sprites !")
End
EndIf
If OpenWindow(#FenetreSpirale,0,0,240,240,"",#PB_Window_BorderLess | #PB_Window_ScreenCentered)
Region=CreateEllipticRgn_(0,0,WindowWidth(#FenetreSpirale),WindowHeight(#FenetreSpirale))
SetWindowRgn_(WindowID(#FenetreSpirale),Region,#True)
DeleteObject_(Region)
SetWindowCallback(@CallBack())
If OpenWindowedScreen(WindowID(#FenetreSpirale),0,0,240,240,0,0,0)
Size=Sqr(240*240+240*240)
CreateSprite(#Sprite2D,Size,Size,#PB_Sprite_Texture)
If StartDrawing(SpriteOutput(#Sprite2D))
For z=0 To 2800
x=Cos(z*#PI/180)*z/15
y=Sin(z*#PI/180)*z/15
Circle(Size/2+x,Size/2+y,1+z/250,RGB(255,255,255))
Next
StopDrawing()
CreateSprite3D(#Sprite3D,#Sprite2D)
EndIf
Delay(100)
hBrush=CreatePatternBrush_(ImageID(#ImageAnneau))
HwndAnneau=OpenWindow(#FenetreAnneau,WindowX(#FenetreSpirale),WindowY(#FenetreSpirale),ImageWidth(#ImageAnneau),ImageHeight(#ImageAnneau),"",#PB_Window_BorderLess | #PB_Window_ScreenCentered | #PB_Window_Invisible)
SetClassLongPtr_(WindowID(#FenetreAnneau),#GCL_HBRBACKGROUND,hBrush)
SetWindowRgn_(WindowID(#FenetreAnneau),GrabRegion(ImageID(#ImageAnneau),RGB(255,255,255)),#True)
SetWindowLong_(WindowID(#FenetreAnneau),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW) ; Cacher de la barre des taches
; StickyWindow(#FenetreAnneau,#True)
StickyWindow(#FenetreAnneau,#False) ; <= c'est ici ***************************************** pour garder les 2 images collées
HideWindow(#FenetreAnneau,#False)
Delay(100)
Else
MessageRequester("Erreur","Impossible d'ouvrir un écran dans la fenêtre!",0)
End
EndIf
EndIf
EndProcedure
FenetreSpirale()
Repeat
Evenement=WaitWindowEvent(1)
FlipBuffers()
ClearScreen(RGB(0,0,0))
Start3D()
RotateSprite3D(#Sprite3D,ElapsedMilliseconds()/5,0)
DisplaySprite3D(#Sprite3D, (240-Size)/2, (240-Size)/2)
Stop3D()
Until GetAsyncKeyState_(#VK_ESCAPE)
Code : Tout sélectionner
; Code créé par NETMAESTRO et TYPHOON réuni pas KCC
Enumeration
#FenetreAnneau
#FenetreSpirale
#ImageAnneau
#Sprite3D
#Sprite2D
EndEnumeration
Global HwndSpirale.l,HwndAnneau.l
; Global HwndAnneau,hBrush,Region,Size
Global hBrush,Region,Size
Image=LoadImage(#ImageAnneau,"L:\program files\PB440\PB440\AnneauOr.bmp")
; Debug image
Procedure CallBack(WND,Message,lParam,wParam)
Result=#PB_ProcessPureBasicEvents
Select WND
Case HwndAnneau
If Message=#WM_MOVE
ResizeWindow(#FenetreSpirale,WindowX(#FenetreAnneau)+25,WindowY(#FenetreAnneau)+25,#PB_Ignore,#PB_Ignore)
ElseIf Message=#WM_LBUTTONDOWN
StickyWindow(#FenetreSpirale,#False)
SendMessage_(WindowID(#FenetreAnneau),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
StickyWindow(#FenetreAnneau,#False)
ElseIf Message=#WM_LBUTTONUP
StickyWindow(#FenetreSpirale,#False)
; SendMessage_(WindowID(#FenetreAnneau),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
StickyWindow(#FenetreAnneau,#False)
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
Procedure GrabRegion(ImageID,TransColor) ; HBITMAP ImageID, COLORREF transcolor
;===============================================
; =
; Very fast bitmap -> region creator =
; By netmaestro =
; Contributors: eesau, nico, flype =
; June 26, 2007 =
; =
; *** IMPORTANT *** =
; =
; transcolor must be in BGR format =
; =
;===============================================
Structure RECTARRAY
rect.RECT[0]
EndStructure
GetObject_(ImageID,SizeOf(BITMAP),@bmp.BITMAP)
Protected width=bmp\bmWidth
Protected height=bmp\bmHeight
Protected hVisibleRgn=CreateRectRgn_(0,0,width,height)
BmiInfo.BITMAPINFOHEADER
With BmiInfo
\biSize=SizeOf(BITMAPINFOHEADER)
\biWidth=width
\biHeight=-height
\biPlanes=1
\biBitCount=32
\biCompression=#BI_RGB
EndWith
rowbytes=SizeOf(LONG)*width
*ColorBits=AllocateMemory(rowbytes*height)
hDC=GetWindowDC_(#Null)
iRes=GetDIBits_(hDC,ImageID,0,height,*ColorBits,@bmiInfo,#DIB_RGB_COLORS)
ReleaseDC_(#Null,hDC)
Structure_Max=(width*height*16)+SizeOf(RGNDATAHEADER)
*Buffer.RGNDATAHEADER=AllocateMemory(Structure_Max)
*rd.RECTARRAY=*Buffer+SizeOf(RGNDATAHEADER)
rectcount=0
For y=0 To height-1
pxcount=0
For x=0 To rowbytes-1 Step 4
*px.LONG=*ColorBits+rowbytes*y+x
If *px\l=transcolor
transcount=1:firsttrans=pxcount
x+SizeOf(LONG) :*px.LONG=*ColorBits+rowbytes*y+x
While *px\l=transcolor And x<=rowbytes-1
transcount+1:pxcount+1:x+SizeOf(LONG)
*px=*ColorBits+rowbytes*y+x
Wend
x-SizeOf(LONG) :*px.LONG=*ColorBits+rowbytes*y+x
*rd\rect[rectcount]\left=firsttrans
*rd\rect[rectcount]\top=y
*rd\rect[rectcount]\right=firsttrans+transcount
*rd\rect[rectcount]\bottom=y+1
rectcount+1
EndIf
pxcount+1
Next
Next
With *Buffer
\dwSize=SizeOf(RGNDATAHEADER)
\iType=#RDH_RECTANGLES
\nCount=rectcount
\nRgnSize=rectcount*SizeOf(RECT)
\rcBound\left=0
\rcBound\top=0
\rcBound\right=width
\rcBound\bottom=height
EndWith
RegionSize=SizeOf(RGNDATAHEADER)+(rectcount*SizeOf(RECT))
hTransparentRgn=ExtCreateRegion_(0,RegionSize,*Buffer)
CombineRgn_(hVisibleRgn,hVisibleRgn,hTransparentRgn,#RGN_XOR)
FreeMemory(*Buffer)
FreeMemory(*ColorBits)
DeleteObject_(hTransparentRgn)
ProcedureReturn hVisibleRgn
EndProcedure
Procedure FenetreSpirale()
If InitSprite()=0 Or InitSprite3D()=0
MessageRequester("Erreur","Impossible d'ouvrir l'écran et l'environnement nécessaire aux sprites !")
End
EndIf
If OpenWindow(#FenetreSpirale,0,0,240,240,"",#PB_Window_BorderLess | #PB_Window_ScreenCentered)
Region=CreateEllipticRgn_(0,0,WindowWidth(#FenetreSpirale),WindowHeight(#FenetreSpirale))
SetWindowRgn_(WindowID(#FenetreSpirale),Region,#True)
DeleteObject_(Region)
SetWindowCallback(@CallBack())
If OpenWindowedScreen(WindowID(#FenetreSpirale),0,0,240,240,0,0,0)
Size=Sqr(240*240+240*240)
CreateSprite(#Sprite2D,Size,Size,#PB_Sprite_Texture)
If StartDrawing(SpriteOutput(#Sprite2D))
For z=0 To 2800
x=Cos(z*#PI/180)*z/15
y=Sin(z*#PI/180)*z/15
Circle(Size/2+x,Size/2+y,1+z/250,RGB(255,255,255))
Next
StopDrawing()
CreateSprite3D(#Sprite3D,#Sprite2D)
EndIf
Delay(100)
hBrush=CreatePatternBrush_(ImageID(#ImageAnneau))
HwndAnneau=OpenWindow(#FenetreAnneau,WindowX(#FenetreSpirale),WindowY(#FenetreSpirale),ImageWidth(#ImageAnneau),ImageHeight(#ImageAnneau),"",#PB_Window_BorderLess | #PB_Window_ScreenCentered | #PB_Window_Invisible)
SetClassLongPtr_(WindowID(#FenetreAnneau),#GCL_HBRBACKGROUND,hBrush)
SetWindowRgn_(WindowID(#FenetreAnneau),GrabRegion(ImageID(#ImageAnneau),RGB(255,255,255)),#True)
SetWindowLong_(WindowID(#FenetreAnneau),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW) ; Cacher de la barre des taches
; StickyWindow(#FenetreAnneau,#True)
StickyWindow(#FenetreAnneau,#False) ; <= c'est ici ***************************************** pour garder les 2 images collées
HideWindow(#FenetreAnneau,#False)
Delay(100)
Else
MessageRequester("Erreur","Impossible d'ouvrir un écran dans la fenêtre!",0)
End
EndIf
EndIf
EndProcedure
FenetreSpirale()
Repeat
WWE = WaitWindowEvent(1)
;WE = WindowEvent(); ne pas mettre cette fonction en service sous risque de dysfonctionnement
Fenetre = EventWindow()
EG = EventGadget()
ET = EventType()
EM = EventMenu()
EWP = EventwParam()
ELP = EventlParam()
If fenetre=#FenetreSpirale And EWP<>MEWP
StickyWindow(#FenetreSpirale,#False)
; SendMessage_(WindowID(#FenetreAnneau),#WM_NCLBUTTONDOWN,#HTCAPTION,0)
StickyWindow(#FenetreAnneau,#False)
EndIf
FlipBuffers()
ClearScreen(RGB(0,0,0))
Start3D()
RotateSprite3D(#Sprite3D,ElapsedMilliseconds()/5,0)
DisplaySprite3D(#Sprite3D, (240-Size)/2, (240-Size)/2)
Stop3D()
MWWE = WWE
;WE = WindowEvent(); ne pas mettre cette fonction en service sous risque de dysfonctionnement
MFenetre = Fenetre
MEG = EG
MET = ET
MEM = EM
MEWP = EWP
MELP = ELP
Until GetAsyncKeyState_(#VK_ESCAPE)
Quand on aime on ne compte pas !Kwai chang caine a écrit : Dis donc cette valse de sticky
J'aurais pas osé en mettre autant ...
Moi j'mattendais a une API de la mort, mais quand on peut faire simple....c'est encore mieux![]()