PureWaitingCircle
Verfasst: 18.05.2008 10:37
Moin,
ich hab mal aus langerweile ein kleinen Codes geschrieben, welcher die das darstellen von Warteanimationen erlaubt!
Wäre dankbar für 'ne bisschen Feedback!
mfg coder
ich hab mal aus langerweile ein kleinen Codes geschrieben, welcher die das darstellen von Warteanimationen erlaubt!
Wäre dankbar für 'ne bisschen Feedback!

Code: Alles auswählen
; gPreferences[460-5-1-1-794-154-0-252-111]
;
;PureWaitingCircle - Engine
;
;geschrieben in PureBasic 4.10
; (C) 2008 by Martin 'coder' Peters
; einfach.martin [at] t-online [dot] de
;
;-OS:
; Windows (X)
; Linux (?)
; MacOS (?)
;
;
;-HAVE:
; PB only (X)
; Without Userlibs (X)
; Without any DLLs (X)
; EnableExplicit (X)
; Unicode (X)
;
;
;-NEED:
; ThreadSafe (X)
; Unicode ( )
; UserMode (?)
; AdminMode ( )
; InlineASM ( )
; PBOSL ( )
; DLLs ( )
EnableExplicit ;->>>EnableExplicit<<<
;-______________________________
;-DECLARATION
#PWC_CMax = 8
Structure PWC
w.l ;width
h.l ;height
Gadget.l ;ImageGadget
Image.l ;ImageID welche genutzt werden kann
Play.b ;Soll die Animation abgespielt werden?
Wait.l ;Zeit die minimal ein Bild zu sehen sein soll (in ms)
Thread.l ;ThreadID
Pos.l ;Position von dem hervorgehobenen Segment
CSize.l ;Durchmesser der Kreise
BackColor.l ;Hintergrundfarbe
Color.l ;Standardfarbe
Color1.l ;1 Farbe
Color2.l ;2 Farbe
Color3.l ;3 Farbe
EndStructure
Structure Punkt2D
X.d
Y.d
EndStructure
;-______________________________
;-HELP PROCS
Procedure EllipseAnglePoint(X, Y, RadiusX, RadiusY, EllipseAngle.d, PositionAngle.d, *Point.Punkt2D)
;RadiusX = Vertikaler Radius
;RadiusY = Horizontaler Radius
;EllipseAngle = Neigung der Ellipse in Grad
;PositionAngle = benötigter Punkt in Grad
;*Point.Punkt2D = Structurierte Variable welche später die Koordinaten des Punktes enthält
Protected dx.d, dy.d
EllipseAngle = EllipseAngle * #PI/180
PositionAngle = PositionAngle * #PI/180
dx = Cos(PositionAngle)*RadiusX - Sin(PositionAngle)*RadiusX
dy = Sin(PositionAngle)*RadiusY + Cos(PositionAngle)*RadiusY
*Point\X = X + Cos(EllipseAngle)*dx - Sin(EllipseAngle)*dy
*Point\Y = Y + Sin(EllipseAngle)*dx + Cos(EllipseAngle)*dy
EndProcedure
Procedure myAbs(Zahl, Min, Max)
If Zahl > Min And Zahl < Max
ProcedureReturn Zahl
EndIf
If Zahl > Max
Repeat
Zahl = Zahl - Max
Until Zahl <= Max
EndIf
If Zahl < Min
Repeat
Zahl = Zahl + Max
Until Zahl >= Min
EndIf
ProcedureReturn Zahl
EndProcedure
;-______________________________
;-PROCS
Procedure PWC_Thread(*Info.PWC)
Protected P.Punkt2D
Protected Color
Protected Start
Protected n
Protected x, y
Protected RadiusX, RadiusY
If *Info\Image = #PB_Any
*Info\Image = CreateImage(#PB_Any, *Info\w, *Info\h)
Else
CreateImage(*Info\Image, *Info\w, *Info\h)
EndIf
SetGadgetState(*Info\Gadget, 0)
Repeat
If *Info\Play = -1
ProcedureReturn 0
EndIf
Delay(100)
Until *Info\Play = #True
x = *Info\w/2
y = *Info\h/2
RadiusX = *Info\w/4
RadiusY = *Info\h/4
Repeat
Start = ElapsedMilliseconds()
StartDrawing(ImageOutput(*Info\Image))
Box(0, 0, *Info\w, *Info\h, *Info\BackColor)
For n = 0 To #PWC_CMax
If *Info\Pos = n
Color = *Info\Color1
ElseIf *Info\Pos = myAbs(n+1, 0, #PWC_CMax)
Color = *Info\Color2
ElseIf *Info\Pos = myAbs(n+2, 0, #PWC_CMax)
Color = *Info\Color3
Else
Color = *Info\Color
EndIf
EllipseAnglePoint(x, y, RadiusX, RadiusY, 0, n*45, P)
Circle(P\x, P\y, *Info\CSize, Color)
Next
StopDrawing()
SetGadgetState(*Info\Gadget, ImageID(*Info\Image))
Repeat
Delay(10)
Until ElapsedMilliseconds()-Start >= *Info\Wait
If *Info\Play <> 1
;SetGadgetState(*Info\Gadget, 0)
Repeat
If *Info\Play = -1
Break 2
EndIf
Delay(100)
Until *Info\Play = #True
EndIf
*Info\Pos = myAbs(*Info\Pos+1, 0, #PWC_CMax)
ForEver
SetGadgetState(*Info\Gadget, 0)
EndProcedure
Procedure PWC_Create(Gadget, w, h, CSize, Image = #PB_Any, Wait = 100, Color = $dddddd, Color1 = $aaaaaa, Color2 = $bbbbbb, Color3 = $cccccc, BackColor = $eeeeee)
Protected *Sys.PWC
Protected Thread
*Sys = AllocateMemory(SizeOf(PWC))
With *Sys
\w = w ;width
\h = h ;height
\Gadget = Gadget ;ImageGadget
\Image = Image ;ImageID welche genutzt werden kann
\Play = 0 ;Soll die Animation abgespielt werden?
\Wait = Wait ;Zeit die minimal ein Bild zu sehen sein soll (in ms)
\Thread = 0 ;ThreadID
\Pos = 0 ;Position von dem hervorgehobenen Segment
\CSize = CSize ;Durchmesser der Kreise
\BackColor = BackColor ;Hintergrundfarbe
\Color = Color ;Standardfarbe
\Color1 = Color1 ;1 Farbe
\Color2 = Color2 ;2 Farbe
\Color3 = Color3 ;3 Farbe
EndWith
Thread = CreateThread(@PWC_Thread(), *Sys.PWC)
*Sys\Thread = Thread
ProcedureReturn *Sys
EndProcedure
Procedure PWC_Play(*Sys.PWC)
*Sys\Play = 1
EndProcedure
Procedure PWC_Stop(*Sys.PWC)
*Sys\Play = 0
EndProcedure
Procedure PWC_Close(*Sys.PWC)
Protected S
*Sys\Play = -1
S = 0
While IsThread(*Sys\Thread)
S + 1
If S > 5
KillThread(*Sys\Thread)
;Debug "Kill Thread"
Break
EndIf
Delay(1)
Wend
FreeImage(*Sys\Image)
SetGadgetState(*Sys\Gadget, 0)
FreeMemory(*Sys)
EndProcedure
Procedure PWC_SetColor(*Sys.PWC, Color = $dddddd, Color1 = $aaaaaa, Color2 = $bbbbbb, Color3 = $cccccc, BackColor = $eeeeee)
With *Sys
\BackColor = BackColor ;Hintergrundfarbe
\Color = Color ;Standardfarbe
\Color1 = Color1 ;1 Farbe
\Color2 = Color2 ;2 Farbe
\Color3 = Color3 ;3 Farbe
EndWith
EndProcedure
Procedure PWC_Hide(*Sys.PWC, State)
If State
PWC_Stop(*Sys)
SetGadgetState(*Sys\Gadget, 0)
Else
PWC_Play(*Sys)
SetGadgetState(*Sys\Gadget, *Sys\Image)
EndIf
EndProcedure
DisableExplicit ;->>>DisableExplicit<<<
;-______________________________
;-EXAMPLE
Define *a.PWC
Define *b.PWC
Define *c.PWC
Define *d.PWC
OpenWindow(0, 0, 0, 512, 256, "PureWaitingCircle Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
ImageGadget(0, 0, 0, 256, 256, 0)
ImageGadget(1, 256, 0, 128, 128, 0)
ImageGadget(2, 256, 128, 256, 128, 0)
ButtonGadget(3, 385, 0, 128, 40, "Pause", #PB_Button_Toggle)
ImageGadget(4, 385, 50, 64, 64, 0)
EndIf
*a = PWC_Create(0, 256, 256, 16, 0)
*b = PWC_Create(1, 128, 128, 16, 1, 50, $dd00dd, $aa00aa, $bb00bb, $cc00cc)
*c = PWC_Create(2, 256, 128, 16, 2, 75, $00dd00, $00aa00, $00bb00, $00cc00)
*d = PWC_Create(4, 64, 64, 5, 3, 100, $444444, $FFFFFF, $DDDDDD, $CCCCCC, 0)
PWC_Play(*a)
PWC_Play(*b)
PWC_Play(*c)
PWC_Play(*d)
Repeat
Event = WaitWindowEvent(1)
If Event = #PB_Event_CloseWindow
Break
ElseIf Event = #PB_Event_Gadget
If EventGadget() = 3
If GetGadgetState(3) = 0
PWC_Play(*a)
PWC_SetColor(*a, $444444, $FFFFFF, $DDDDDD, $CCCCCC, 0)
Else
PWC_Stop(*a)
EndIf
EndIf
EndIf
ForEver
HideWindow(0, 1)
PWC_Close(*a)
PWC_Close(*b)
PWC_Close(*c)
PWC_Close(*d)
End