EnumerationBinary #Align_Hor_Left #Align_Hor_Middle #Align_Hor_Right #Align_Ver_Top #Align_Ver_Middle #Align_Ver_Bottom EndEnumeration Structure SpriteMove StartValue.f EndValue.f *Value.FLoat StartTime.l Duration.l Easing.l Event.l AutoDestroySprites.b EndStructure Enumeration #Spr_Depth_Background #Spr_Depth_Middle #Spr_Depth_Front #Spr_ALL EndEnumeration Structure SpriteData SpriteNo.l X.f Y.f Width.f Height.f Opacity.f Size.f Align.c Depth.l List Move.SpriteMove() MoveStartTime.q AutoDestroy.b ;if #true autodestroy the sprite (From DisplayEngine()) EndStructure Global NewList Sprites.SpriteData() Procedure.i NewSprite(SpriteNo.l,X.f,Y.f,Width.f,Height.f,Opacity.l,Size.f,Depth.l=#Spr_Depth_Front,Align.b=9) Protected *Mem *Mem=AddElement(Sprites()) Sprites()\SpriteNo=SpriteNo Sprites()\X=X Sprites()\Y=Y Sprites()\Width=Width Sprites()\Height=Height Sprites()\Opacity=Opacity Sprites()\Size=Size Sprites()\MoveStartTime=-1 Sprites()\Align=Align Sprites()\AutoDestroy=#False Sprites()\Depth=Depth ProcedureReturn *Mem EndProcedure Procedure _Addmove(*Sprite.SpriteData,ThisStartTime.l,*Value,StartValue.f,EndValue.f,Duration.l,Easing.l,Event.l=-1) AddElement(*Sprite\Move()) *Sprite\Move()\Value=*Value *Sprite\Move()\StartTime=ThisStartTime *Sprite\Move()\StartValue=StartValue *Sprite\Move()\EndValue=EndValue *Sprite\Move()\Duration=Duration *Sprite\Move()\Easing=Easing *Sprite\Move()\Event=Event EndProcedure Procedure ClearMove(*Sprite.SpriteData) ClearList(*Sprite\Move()) EndProcedure Procedure StartMove(*Sprite.SpriteData,StartTime.q=0) If StartTime=0 *Sprite\MoveStartTime=ElapsedMilliseconds() Else *Sprite\MoveStartTime=StartTime EndIf EndProcedure Procedure StartAllMove() Protected StartTime.q=ElapsedMilliseconds() ForEach Sprites()\Move() ;Sprites()\Move()\StartTime=StartTime Next EndProcedure Procedure myDisplaySprite(*Sprite.SpriteData) ;Display Protected X.f Protected Y.f Protected Width.f Protected Height.f Protected RealWidth.l Protected RealHeight.l If *Sprite\SpriteNo>0 And IsSprite(GameSprite(*Sprite\SpriteNo)\SpriteId) ClipSprite(GameSprite(*Sprite\SpriteNo)\SpriteId,GameSprite(*Sprite\SpriteNo)\ClipX,GameSprite(*Sprite\SpriteNo)\ClipY,GameSprite(*Sprite\SpriteNo)\ClipWidth,GameSprite(*Sprite\SpriteNo)\ClipHeight) If *Sprite\Width<>-1 Width=*Sprite\Width Else Width=GameSprite(*Sprite\SpriteNo)\DisplayWidth EndIf If *Sprite\Height<>-1 Height=*Sprite\Height Else Height=GameSprite(*Sprite\SpriteNo)\DisplayHeight EndIf RealWidth=Width * GUI\BlockSize RealHeight=Height * GUI\BlockSize If Not (*Sprite\Opacity=0 Or Height=0 Or Width=0) ZoomSprite(GameSprite(*Sprite\SpriteNo)\SpriteId,RealWidth * *Sprite\Size,RealHeight * *Sprite\Size) If *Sprite\Align & #Align_Hor_Left = #Align_Hor_Left X=*Sprite\X EndIf If *Sprite\Align & #Align_Hor_Middle = #Align_Hor_Middle X=*Sprite\X-Width/2* *Sprite\Size EndIf If *Sprite\Align & #Align_Hor_Right = #Align_Hor_Right X=*Sprite\X-Width* *Sprite\Size EndIf If *Sprite\Align & #Align_Ver_Top = #Align_Ver_Top Y=*Sprite\Y EndIf If *Sprite\Align & #Align_Ver_Middle=#Align_Ver_Middle Y=*Sprite\Y-Height/2* *Sprite\Size EndIf If *Sprite\Align & #Align_Ver_Bottom= #Align_Ver_Bottom Y=*Sprite\Y-Height* *Sprite\Size EndIf X=X * GUI\BlockSize Y=Y * GUI\BlockSize DisplayTransparentSprite(GameSprite(*Sprite\SpriteNo)\SpriteId,X,Y,*Sprite\Opacity) EndIf Else ;Debug "Error with sprite" EndIf EndProcedure Procedure DisplaySprites(Depth.l=#Spr_ALL) Protected SpriteNo.l Protected ThisStartTime.q Protected ThisEndTime.q Protected ElapsedTime.l Protected AutodestroySprite.b ForEach Sprites() If Depth=#Spr_ALL Or Sprites()\Depth=Depth ;Move If Sprites()\MoveStartTime>-1 If ListSize(Sprites()\Move())>0 ForEach Sprites()\Move() ThisStartTime=Sprites()\MoveStartTime+Sprites()\Move()\StartTime ThisEndTime=ThisStartTime+Sprites()\Move()\Duration If ElapsedMilliseconds()>=ThisStartTime And ElapsedMilliseconds()<=ThisEndTime ElapsedTime.l=ElapsedMilliseconds()-ThisStartTime Sprites()\Move()\Value\f=GetEasingPosValue(Sprites()\Move()\StartValue, Sprites()\Move()\EndValue,ThisStartTime, Sprites()\Move()\Duration, Sprites()\Move()\Easing) ;Debug StrF(ListIndex(Sprites()\Move())) +" Value:"+StrF( Sprites()\Move()\Value\f)+" Elapestime:"+Str(ElapsedTime) ;At the End ElseIf ElapsedMilliseconds()>=ThisEndTime Sprites()\Move()\Value\f=Sprites()\Move()\EndValue ;new Event If Sprites()\Move()\Event>-1 PostEventGUI(Sprites()\Move()\Event) Sprites()\Move()\Event=-1 EndIf DeleteElement(Sprites()\Move()) EndIf Next Else ;AutodestroySprite=Sprites()\AutoDestroySprites EndIf EndIf ;Display myDisplaySprite(Sprites()) ; SpriteNo=Sprites()\SpriteNo ; If SpriteNo>0 And IsSprite(GameSprite(SpriteNo)\SpriteId) ; ClipSprite(GameSprite(SpriteNo)\SpriteId,GameSprite(SpriteNo)\ClipX,GameSprite(SpriteNo)\ClipY,GameSprite(SpriteNo)\ClipWidth,GameSprite(SpriteNo)\ClipHeight) ; ; If Sprites()\Width<>-1 ; Width=Sprites()\Width ; Else ; Width=GameSprite(SpriteNo)\DisplayWidth ; EndIf ; ; If Sprites()\Height<>-1 ; Height=Sprites()\Height ; Else ; Height=GameSprite(SpriteNo)\DisplayHeight ; EndIf ; ; RealWidth=Width * GUI\BlockSize ; RealHeight=Height * GUI\BlockSize ; If Not (Sprites()\Opacity=0 Or Height=0 Or Width=0) ; ZoomSprite(GameSprite(SpriteNo)\SpriteId,RealWidth * Sprites()\Size,RealHeight * Sprites()\Size) ; ; If Sprites()\Align & #Align_Hor_Left = #Align_Hor_Left ; X=Sprites()\X ; EndIf ; ; If Sprites()\Align & #Align_Hor_Middle = #Align_Hor_Middle ; X=Sprites()\X-Width/2* Sprites()\Size ; EndIf ; ; If Sprites()\Align & #Align_Hor_Right = #Align_Hor_Right ; X=Sprites()\X-Width* Sprites()\Size ; EndIf ; ; If Sprites()\Align & #Align_Ver_Top = #Align_Ver_Top ; Y=Sprites()\Y ; EndIf ; ; If Sprites()\Align & #Align_Ver_Middle=#Align_Ver_Middle ; Y=Sprites()\Y-Height/2* Sprites()\Size ; EndIf ; If Sprites()\Align & #Align_Ver_Bottom= #Align_Ver_Bottom ; Y=Sprites()\Y-Height* Sprites()\Size ; EndIf ; X=X * GUI\BlockSize ; Y=Y * GUI\BlockSize ; DisplayTransparentSprite(GameSprite(SpriteNo)\SpriteId,X,Y,Sprites()\Opacity) ; EndIf ; Else ; ;Debug "Error with sprite" ; EndIf If ListSize(Sprites()\Move())=0 And AutodestroySprite=#True DeleteElement(Sprites()) EndIf EndIf Next EndProcedure Procedure ClearAllSprite() ClearList(Sprites()) EndProcedure ; IDE Options = PureBasic 6.00 Beta 6 (Windows - x64) ; CursorPosition = 183 ; FirstLine = 134 ; Folding = -- ; EnableXP