Files
LoopzRemix/SpritesObj.pbi
2025-07-17 20:36:20 +02:00

259 lines
7.7 KiB
Plaintext

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