Code: Alles auswählen
; ############################################################################################
; # #
; # AnimSprite - Module #
; # #
; ############################################################################################
; # #
; # Author: Imhotheb (Andy) #
; # Date: 2017-09-15 #
; # Update: 2017-09-17 #
; # OS: Windows, Linux (untested), OSX (untested) #
; # Compiler: 5.60+ #
; # 32 Bit: Yes #
; # 64 Bit: Yes #
; # Unicode: doesn't matter (no Strings used) #
; # Threadsafe: NO (Sprites/Screen are not threadsafe) #
; # #
; ############################################################################################
; # #
; # Beschreibung/Description: #
; # #
; # Dieses Modul beinhaltet Fuktionen um einfach animierte Sprites (AnimSprites) #
; # verwenden zu können. #
; # AnimSprites können durch andere Sprites oder Bilder erstellt werden. Animierte GIF's #
; # könne direkt in einen AnimSprite "umgewandelt" und sehr einfach dargestellt werden. #
; # AnimSprites können (wie "normale" Sprites auch) rotiert, vergrößert/verkleinert und #
; # "geclipped" werden. Zusätzlich kann die Geschwindigkeit eingestellt werden und #
; # automatisch an die FPS angepasst werden. #
; # #
; # ---------------------------------------------------------------------------------------- #
; # #
; # This module includes functions for simple sprite animations (AnimSprites) #
; # AnimSprites can be created by other sprites or images. Animated GIF's #
; # can be directly converted into an AnimSprite and displayed very easily. #
; # AnimSprites can be (like "normal" sprites also) rotated, zoomed in / out and #
; # cutted. In addition, the speed can be set and can automatically adapted to the FPS. #
; # #
; ############################################################################################
; # #
; # MIT License #
; # #
; # Copyright (c) <2017> <Imhotheb> #
; # #
; # Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der #
; # zugehörigen Dokumentationen (die "Software") erhält, die Erlaubnis erteilt, #
; # sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, #
; # sie zu verwenden, zu kopieren, zu verändern, zusammenzufügen, zu veröffentlichen, #
; # zu verbreiten, zu unterlizenzieren und/oder zu verkaufen, und Personen, denen diese #
; # Software überlassen wird, diese Rechte zu verschaffen, unter den folgenden Bedingungen: #
; # #
; # Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen Kopien #
; # oder Teilkopien der Software beizulegen. #
; # #
; # DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE BEREITGESTELLT, #
; # EINSCHLIEßLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN VORGESEHENEN ODER EINEM BESTIMMTEN #
; # ZWECK SOWIE JEGLICHER RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL #
; # SIND DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE ANSPRÜCHE #
; # HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, EINES DELIKTES ODER #
; # ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER SONSTIGER VERWENDUNG DER SOFTWARE #
; # ENTSTANDEN. #
; # #
; # ---------------------------------------------------------------------------------------- #
; # #
; # Permission is hereby granted, free of charge, to any person obtaining a copy of #
; # this software and associated documentation files (the "Software"), to deal in the #
; # Software without restriction, including without limitation the rights to use, copy, #
; # modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, #
; # and to permit persons to whom the Software is furnished to do so, #
; # subject to the following conditions: #
; # #
; # The above copyright notice and this permission notice shall be included in all copies #
; # or substantial portions of the Software. #
; # #
; # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, #
; # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A #
; # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT #
; # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION #
; # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE #
; # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #
; # #
; ############################################################################################
; # #
; # History: #
; # #
; # 170916 initiale Version #
; # #
; # 1709161 # Dokumentation verbessert #
; # 1709171 # Überprüfung bei CreateSpriteFromImages() hinzugefügt #
; # 1709172 + CreateCopy() hinzugefügt #
; # 1709173 # Ein Fehler in Add*() wurde behoben #
; # 1709174 # Ein Fehler in GetSprite() wurde behoben #
; # 1709175 # Ein Fehler in NextPos() wurde behoben #
; # 1709175 + Parameter in Display*() für automatischen Richtungswechsel #
; # #
; # #
; ############################################################################################
DeclareModule AnimSprite
#POS_First = 0 ; Position: Anfang
#POS_Last = -1 ; Position: Ende
; Erzeugt einen leeren AnimSprite
Declare Create() ; liefert einen Pointer mit Mem_Struct zurück
; Erzeuge ein AnimSprite von mehreren Bildern (PB-Image mit SetImageFrame(), im Moment nur GIF's)
Declare CreateFromImages(Image.i, ;= PB-Image
Width.i = -1, ;= Breite ... bei -1 bzw. #PB_Default wird die Breite des PB-Image ermittelt (mit ImageWidth())
Heigth.i = -1, ;= Höhe ... bei -1 bzw. #PB_Default wird die Höhe des PB-Image ermittelt (mit ImageHeigth())
Mode.i = #PB_Sprite_AlphaBlending, ;= CreateSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
TransparentSpriteColor = #Black, ;= Hintergrundfarbe die Transparent wird ... siehe TransparentSpriteColor()
*LoadCallBack = #Null) ;= CallBack für Ladeanzeige (ein Parameter (Interger) für Fortschritt) ... z.B. LCB(Value.i)
; der Wert wird bei jedem Einzelbild aktualisiert ... (0 bis 1000)
; Zeigt ein AnimSprite transparent auf einem Screen an ... siehe DisplayTransparentSprite()
Declare DisplayTransparent(*AnimSprite, ;= AnimSprite
x, y, ;= Koordinaten (Pixel)
Intensity = 255, ;= Intensität (0 = Transparent / 255 = Undurchsichtig)
Color = -1, ;= Farbe zum Darstellen des Sprite (RGB())
AutoDirection = #False) ;= Automatischer Richtungswechsel (ändert automatisch Speed in +/-)
; Zeigt ein AnimSprite auf einem Screen an ... siehe DisplaySprite()
Declare Display(*AnimSprite, ;= AnimSprite
x, y, ;= Koordinaten (Pixel)
AutoDirection = #False) ;= Automatischer Richtungswechsel (ändert automatisch Speed in +/-)
; Dreht einen AnimSprite ... siehe RotateSprite()
Declare Rotate(*AnimSprite, ;= AnimSprite
Angel.f, ;= Winkel in Grad (0 bis 360 im Uhrzeigersinn)
Mode = #PB_Relative) ;= #PB_Absolute oder #PB_Relative
; Vergrößert/Verkleinert einen AnimSprite ... siehe ZoomSprite()
Declare Zoom(*AnimSprite, ;= AnimSprite
Width, ;= neue Breite / anfängliche Breite mit #PB_Default
Heigth) ;= neue Höhe / anfängliche Höhe mit #PB_Default
; Fügt einen Clip-Bereich hinzu ... siehe ClipSprite()
Declare Clip(*AnimSprite, ;= AnimSprite
x = #PB_Default, y = #PB_Default, ;= Startposition ... #PB_Default entfernt das Clipping
Width = #PB_Default, Heigth = #PB_Default) ;= Größe ... #PB_Default entfernt das Clipping
; kopiert den AnimSprite mit allen Werten (Position / Speed / etc.) ... siehe CopySprite() ... WICHTIG: *OUT muss VORHER mit AnimSprite::Create() erzeugt worden sein !!
Declare Copy(*In, ;= zu Kopierender AnimSprite
*Out, ;= Ausgabe AnimSprite (muss mit AnimSprite::Create() erzeugt worden sein)
Mode = #PB_Sprite_AlphaBlending, ;= CreateSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
TransparentSpriteColor = #Black) ;= Hintergrundfarbe die Transparent wird ... siehe TransparentSpriteColor()
; erzeugt einen AnimSprite mit dem Inhalt von *In
Declare CreateCopy(*In, ;= zu Kopierender AnimSprite
Mode = #PB_Sprite_AlphaBlending, ;= CreateSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
TransparentSpriteColor = #Black) ;= Hintergrundfarbe die Transparent wird ... siehe TransparentSpriteColor()
; ändert die Richtung und Geschwindigkeit des Wechsel
Declare SetSpeed(*Animsprite, ;= AnimSprite
Speed.f) ;= neue Geschwindigkeit/Richtung ( +1 = Vorwärts / -1 = Rückwärts / 0 = Standbild)
; gibt die aktuelle Geschwindkeit zurück
Declare.f GetSpeed(*AnimSprite) ;= AnimSprite
; ändert die aktuelle Position
Declare SetPos(*AnimSprite, ;= AnimSprite
Pos.f) ;= neue Position
; gibt die aktuelle Position zurück
Declare.f GetPos(*AnimSprite) ;= AnimSprite
; kopiert mehrere Bilder (PB-Image mit SetImageFrame(), im Moment nur GIF's) in einen AnimSprite
Declare CopyFromImages(Image.i, ;= PB-Image
*Out, ;= Ausgabe AnimSprite
Width.i = -1, ;= Breite ... bei -1 bzw. #PB_Default wird die Breite des PB-Image ermittelt (mit ImageWidth())
Heigth.i = -1, ;= Höhe ... bei -1 bzw. #PB_Default wird die Höhe des PB-Image ermittelt (mit ImageHeigth())
Mode.i = #PB_Sprite_AlphaBlending, ;= CreateSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
TransparentSpriteColor = #Black, ;= Hintergrundfarbe die Transparent wird ... siehe TransparentSpriteColor()
*LoadCallBack = #Null) ;= CallBack für Ladeanzeige (ein Parameter (Interger) für Fortschritt) ... z.B. LCB(Value.i)
; der Wert wird bei jedem Einzelbild aktualisiert ... (0 bis 1000)
; fügt einen Sprite zu einem AnimSprite hinzu
Declare AddSprite(*AnimSprite, ;= AnimSprite
Sprite, ;= #Sprite (PB-ID), nicht SpriteID()
Pos = AnimSprite::#POS_Last, ;= Position (folgende Sprites werden nach Hinten verschoben)
Copy = #False, ;= #True = der Sprite wird kopiert / #False = der Sprite wird direkt verwendet (und mit Free() auch gelöscht!!)
Mode = #Null) ;= CopySprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending) ... siehe CopySprite()
; kopiert ein (PB-)Image und fügt einen Sprite hinzu
Declare AddImage(*AnimSprite, ;= AnimSprite
Image, ;= (PB-)Image
Pos = AnimSprite::#POS_Last, ;= Position (folgende Sprites werden nach Hinten verschoben)
Width = -1, ;= Breite ... bei -1 bzw. #PB_Default wird die Breite des (PB-)Image ermittelt (mit ImageWidth())
Heigth = -1, ;= Höhe ... bei -1 bzw. #PB_Default wird die Höhe des (PB-)Image ermittelt (mit ImageHeigth())
Mode = #PB_Sprite_AlphaBlending, ;= CreateSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
TransparentSpriteColor = #Black) ;= Hintergrundfarbe die Transparent wird ... siehe TransparentSpriteColor()
; lädt einen Sprite aus einer Datei ... siehe LoadSprite()
Declare AddLoadSprite(*AnimSprite, ;= AnimSprite
File.s, ;= Dateiname
Pos = AnimSprite::#POS_Last, ;= Position (folgende Sprites werden nach Hinten verschoben)
Mode = #Null) ;= LoadSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
; fotografiert den Bildschirminhalt ... siehe GrabSprite()
Declare AddGrabSprite(*AnimSprite, ;= AnimSprite
x, y, ;= Startposition auf dem Bildschirm
Width, Heigth, ;= Größe
Pos = AnimSprite::#POS_Last, ;= Position (folgende Sprites werden nach Hinten verschoben)
Mode = #Null) ;= GrabSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
; lädt einen Sprite aus dem angegeben Speicherbereich ... siehe CatchSprite()
Declare AddCatchSprite(*AnimSprite, ;= AnimSprite
*Ptr, ;= Startadresse des Sprite/Images
Pos = AnimSprite::#POS_Last, ;= Position (folgende Sprites werden nach Hinten verschoben)
Mode = #Null) ;= CatchSprite(..., Mode) (#PB_Sprite_PixelCollision|#PB_Sprite_AlphaBlending)
; vertauscht die Position von zwei Sprites
Declare SwitchSprite(*AnimSprite, ;= AnimSprite
Pos1, Pos2) ;= Positionen die getauscht werden (0 bis AnimSprite::MaxPos)
; löscht einen einzelnnen Sprite
Declare DelSprite(*AnimSprite, ;= AnimSprite
Pos) ;= Sprite-Position die gelöscht wird, verbleibende Sprites werden automatisch in ihrer Position angepasst
; löscht den AnimSprite, gibt alle mit ihm verbundenen Sprites und reservierten Speicher frei
Declare Free(*AnimSprite) ;= AnimSprite
; gibt die größtmögliche Position zurück
Declare MaxPos(*AnimSprite) ;= AnimSprite
; gibt die (PB-)ID eines einzelnen Sprite zurück (NICHT die SpriteID()!!)
Declare GetSprite(*AnimSprite, ;= AnimSprite
Pos) ;= Position des Sprite
; (er-)setzt einen anderen Sprite ein ... VORISCHT: der bereits eingetragene Sprite wird NICHT gelöscht und verbleibt im Speicher
Declare SetSprite(*AnimSprite, ;= AnimSprite
Pos, ;= Position für #Sprite
Sprite) ;= #Sprite (PB-ID), nicht SpriteID()
; gibt die Breite eines Sprites zurück
Declare Width(*AnimSprite, ;= AnimSprite
Pos = 0) ;= Position
; gibt die Höhe eines Sprites zurück
Declare Heigth(*AnimSprite, ;= AnimSprite
Pos = 0) ;= Position
; setzt einen Teiler für die Geschwindigkeit ... nützlich um verschiedene FPS auszugleichen ... für ALLE AnimSprites gütlig
Declare SetSpeedDivider(Div.f)
; automatische Geschwindigkeitsanpassung ein-/ausschalten
Declare AutoSpeed(Enabled = #True) ; #True / #False
; gibt den aktuellen Geschwindigkeitsteiler zurück
Declare.f GetSpeedDivider()
; gibt die Anzahl der einzelnen Sprites eines AnimSprites zurück
Macro Size(__AnimSprite__) ;= AnimSprite
(AnimSprite::MaxFrame(__AnimSprite__) + 1)
EndMacro
EndDeclareModule
Module AnimSprite
EnableExplicit
; Interne Konfiguration
Structure Modul_Config
Use_Speed_Divider.i
Speed_Divider.f
EndStructure
Global Conf.Modul_Config
Conf\Speed_Divider = 1
; Interne Deklarationen
; ---------------------
; Macro für die Anzeige von Fehlern
Macro DebugLog(__Text__)
Debug __Text__
EndMacro
; Struktur eines AnimSprite(-"Objekt/Handle/WhatEver")
Structure Mem_Struct
Frame_Max.i ; Höchster Wert für Array (tatsächliche Größe = Frame_Max + 1)
Pos.f ; Aktuelle Position im Array
Speed.f ; Geschwindigkeit (Wechsel der einzelnen Sprites), bestimmt auch die Richtung (+/-)
;Width.i ; Breite
;Heigth.i ; Höhe
;Array Angle.f(0) ; Gespeicherter Winkel für Sprite
Array Sprite.i(0) ; Sprite-Array
EndStructure
; Prototyp für Ladestand
Prototype LoadCallBack(Value.i)
; erzeuget ein Sprite aus einem (PB-)Image
Procedure CreateSpriteFromImage(Image, Width = -1, Heigth = -1, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black)
Protected ret = #False
If IsImage(Image)
If Width < 0
Width = ImageWidth(Image)
EndIf
If Heigth < 0
Heigth = ImageHeight(Image)
EndIf
ret = CreateSprite(#PB_Any, Width, Heigth, Mode)
If ret
If StartDrawing(SpriteOutput(ret))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawImage(ImageID(Image), 0, 0, Width, Heigth)
StopDrawing()
If mode & #PB_Sprite_AlphaBlending
TransparentSpriteColor(ret, TransparentSpriteColor)
EndIf
Else
DebugLog("AnimSprite::CopyFromImage(): StartDrawing() failed")
EndIf
Else
DebugLog("AnimSprite::CopyFromImage(): CreateSprite() failed")
EndIf
Else
DebugLog("AnimSprite::CopyFromImage(): Image(" + Str(Image) + ") is not an image")
EndIf
ProcedureReturn ret
EndProcedure
; fügt einen NICHT INITIALISIERTEN Sprite ein
Procedure InsSprite(*AnimSprite.Mem_Struct, Pos = AnimSprite::#POS_Last)
Protected i, ret = #False
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
; ElseIf Pos > *AnimSprite\Frame_Max + 1
; Pos = *AnimSprite\Frame_Max + 1
EndIf
If *AnimSprite
*AnimSprite\Frame_Max + 1
ReDim *AnimSprite\Sprite(*AnimSprite\Frame_Max)
For i = *AnimSprite\Frame_Max To Pos + 1 Step -1
*AnimSprite\Sprite(i) = *AnimSprite\Sprite(i - 1)
Next
; Reset Position
AnimSprite::SetPos(*AnimSprite, 0)
ret = *AnimSprite\Frame_Max
Else
DebugLog("AnimSprite::InsSprite(): *AnimSprite is NULL")
EndIf
ProcedureReturn ret
EndProcedure
; verschiebt die interne Position
Procedure NextPos(*AnimSprite.Mem_Struct, AutoDirection = #False)
Protected Speed.f
If Conf\Use_Speed_Divider
If Conf\Speed_Divider <> 0
Speed = *AnimSprite\Speed / Conf\Speed_Divider
Else
Speed = *AnimSprite\Speed
EndIf
Else
Speed = *AnimSprite\Speed
EndIf
*AnimSprite\Pos + Speed
If *AnimSprite\Speed > 0
If Int(*AnimSprite\Pos) > *AnimSprite\Frame_Max
If AutoDirection
*AnimSprite\Speed = 0 - *AnimSprite\Speed
*AnimSprite\Pos - Speed
Else
*AnimSprite\Pos = 0
EndIf
EndIf
ElseIf *AnimSprite\Speed < 0
If Int(*AnimSprite\Pos) < 0
If AutoDirection
*AnimSprite\Speed = 0 - *AnimSprite\Speed
*AnimSprite\Pos - Speed
Else
*AnimSprite\Pos = *AnimSprite\Frame_Max
EndIf
EndIf
EndIf
EndProcedure
Procedure CopyFromImages(Image, *Out.Mem_Struct, Width = -1, Heigth = -1, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black, *LoadCallBack = #Null)
Protected i
If *LoadCallBack
Protected LCB.LoadCallBack = *LoadCallBack
EndIf
If *Out
*Out\Frame_Max = ImageFrameCount(Image) - 1
ReDim *Out\Sprite(*Out\Frame_Max)
; Jedes Einzelbild als Sprite erzeugen (nur bei GIF's)
For i = 0 To *Out\Frame_Max
SetImageFrame(Image, i)
*Out\Sprite(i) = CreateSpriteFromImage(Image, Width, Heigth, Mode, TransparentSpriteColor)
If LCB
LCB((i + 1) * 1000 / *Out\Frame_Max)
EndIf
Next
; Standartwerte setzen
*Out\Speed = 1
*Out\Pos = 0
Else
DebugLog("AnimSprite::CopyFromImages(): *Out is NULL")
EndIf
ProcedureReturn i + 1
EndProcedure
Procedure DisplayTransparent(*AnimSprite.Mem_Struct, x, y, Intensity = 255 , Color = -1, AutoDirection = #False)
If *AnimSprite
If *AnimSprite\Frame_Max >= 0
DisplayTransparentSprite(*AnimSprite\Sprite(Int(*AnimSprite\Pos)), x, y, Intensity, Color)
NextPos(*AnimSprite, AutoDirection) ; nächste Position setzen
Else
DebugLog("AnimSprite::DisplayTransparent(): *AnimSprite is Not valid")
EndIf
Else
DebugLog("AnimSprite::DisplayTransparent(): *AnimSprite is NULL")
EndIf
EndProcedure
Procedure Display(*AnimSprite.Mem_Struct, x, y, AutoDirection = #False)
If *AnimSprite
If *AnimSprite\Frame_Max >= 0
DisplaySprite(*AnimSprite\Sprite(Int(*AnimSprite\Pos)), x, y)
NextPos(*AnimSprite, AutoDirection) ; nächste Position setzen
Else
DebugLog("AnimSprite::Display(): *AnimSprite is Not valid")
EndIf
Else
DebugLog("AnimSprite::Display(): *AnimSprite is NULL")
EndIf
EndProcedure
Procedure Rotate(*AnimSprite.Mem_Struct, Angle.f, Mode = #PB_Relative)
Protected i, ret = #False
If *AnimSprite
If *AnimSprite\Frame_Max >= 0
For i = 0 To *AnimSprite\Frame_Max
RotateSprite(*AnimSprite\Sprite(i), Angle, Mode)
Next
ret = #True
Else
DebugLog("AnimSprite::Rotate(): *AnimSprite is Not valid")
EndIf
Else
DebugLog("AnimSprite::Rotate(): *AnimSprite is NULL")
EndIf
ProcedureReturn ret
EndProcedure
Procedure Zoom(*AnimSprite.Mem_Struct, Width, Heigth)
Protected i, ret = #False
If *AnimSprite
If *AnimSprite\Frame_Max >= 0
For i = 0 To *AnimSprite\Frame_Max
ZoomSprite(*AnimSprite\Sprite(i), Width, Heigth)
Next
ret = #True
Else
DebugLog("AnimSprite::Zoom(): *AnimSprite is Not valid")
EndIf
Else
DebugLog("AnimSprite::Zoom(): *AnimSprite is NULL")
EndIf
ProcedureReturn ret
EndProcedure
Procedure Clip(*AnimSprite.Mem_Struct, x = #PB_Default, y = #PB_Default, Width = #PB_Default, Heigth = #PB_Default)
Protected i
If *AnimSprite
If *AnimSprite\Frame_Max >= 0
For i = 0 To *AnimSprite\Frame_Max
ClipSprite(*AnimSprite\Sprite(i), x, y, Width, Heigth)
Next
Else
DebugLog("AnimSprite::Clip(): *AnimSprite is NOT valid")
EndIf
Else
DebugLog("AnimSprite::Clip(): *AnimSprite is NULL")
EndIf
EndProcedure
Procedure Copy(*In.Mem_Struct, *Out.Mem_Struct, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black)
Protected i
If *In
If *In\Frame_Max >= 0
If *Out
ReDim *Out\Sprite(*In\Frame_Max)
; ReDim *Out\Angle(*In\Frame_Max)
For i = 0 To *In\Frame_Max
*Out\Sprite(i) = CopySprite(*In\Sprite(i), #PB_Any, Mode)
; *Out\Angle(i) = *In\Angle(i)
If Mode & #PB_Sprite_AlphaBlending
TransparentSpriteColor(*Out\Sprite(i), TransparentSpriteColor)
EndIf
Next
*Out\Frame_Max = *In\Frame_Max
*Out\Pos = *In\Pos
*Out\Speed = *In\Speed
Else
DebugLog("AnimSprite::Copy(): *Out is NULL")
EndIf
Else
DebugLog("AnimSprite::DisplayTransparent(): *In (AnimSprite) is Not valid")
EndIf
Else
DebugLog("AnimSprite::Copy(): *In is NULL")
EndIf
EndProcedure
Procedure SetPos(*AnimSprite.Mem_Struct, Pos.f)
If Pos < 0 ; Für #POS_Last
Pos = *AnimSprite\Frame_Max
ElseIf Pos > *AnimSprite\Frame_Max
Pos = *AnimSprite\Frame_Max
EndIf
*AnimSprite\Pos = Pos
EndProcedure
Procedure.f GetPos(*AnimSprite.Mem_Struct)
ProcedureReturn *AnimSprite\Pos
EndProcedure
Procedure SetSpeed(*Animsprite.Mem_Struct, Speed.f)
*Animsprite\Speed = Speed
EndProcedure
Procedure.f GetSpeed(*AnimSprite.Mem_Struct)
ProcedureReturn *AnimSprite\Speed
EndProcedure
Procedure MaxPos(*AnimSprite.Mem_Struct)
ProcedureReturn *AnimSprite\Frame_Max
EndProcedure
Procedure GetSprite(*AnimSprite.Mem_Struct, Pos)
Protected ret = #False
If Pos <= *AnimSprite\Frame_Max And Pos >= 0
If IsSprite(*AnimSprite\Sprite(Pos))
ret = *AnimSprite\Sprite(Pos)
EndIf
EndIf
ProcedureReturn ret
EndProcedure
Procedure SetSprite(*AnimSprite.Mem_Struct, Pos, Sprite)
If IsSprite(Sprite)
*AnimSprite\Sprite(Pos) = Sprite
EndIf
EndProcedure
Procedure Width(*AnimSprite.Mem_Struct, Pos = 0)
Protected ret = 0
If Pos <= *AnimSprite\Frame_Max And Pos >= 0
If IsSprite(*AnimSprite\Sprite(Pos))
ret = SpriteWidth(*AnimSprite\Sprite(Pos))
EndIf
EndIf
ProcedureReturn ret
EndProcedure
Procedure Heigth(*AnimSprite.Mem_Struct, Pos = 0)
Protected ret = 0
If Pos <= *AnimSprite\Frame_Max And Pos >= 0
If IsSprite(*AnimSprite\Sprite(Pos))
ret = SpriteHeight(*AnimSprite\Sprite(Pos))
EndIf
EndIf
ProcedureReturn ret
EndProcedure
Procedure AddSprite(*AnimSprite.Mem_Struct, Sprite, Pos = AnimSprite::#POS_Last, Mode = #Null, Copy = #False)
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
EndIf
If Pos <= *AnimSprite\Frame_Max + 1 And Pos >= 0
If IsSprite(Sprite)
If Copy
Sprite = CopySprite(Sprite, #PB_Any, Mode)
EndIf
InsSprite(*AnimSprite, Pos)
*AnimSprite\Sprite(Pos) = Sprite
Else
DebugLog("AnimSprite::AddSprite(): Sprite (ID:" + Str(Sprite) + ") is not a sprite")
EndIf
EndIf
EndProcedure
Procedure AddImage(*AnimSprite.Mem_Struct, Image, Pos = AnimSprite::#POS_Last, Width = -1, Heigth = -1, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black)
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
EndIf
If Pos <= *AnimSprite\Frame_Max + 1 And Pos >= 0
If IsImage(Image)
InsSprite(*AnimSprite, Pos)
*AnimSprite\Sprite(Pos) = CreateSpriteFromImage(Image, Width, Heigth, Mode, TransparentSpriteColor)
Else
DebugLog("AnimSprite::AddImage(): Image (ID:" + Str(Image) + ") is not an image")
EndIf
EndIf
EndProcedure
Procedure AddLoadSprite(*AnimSprite.Mem_Struct, File.s, Pos = AnimSprite::#POS_Last, Mode = #Null)
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
EndIf
If Pos <= *AnimSprite\Frame_Max + 1 And Pos >= 0
If FileSize(File) > 0
InsSprite(*AnimSprite, Pos)
*AnimSprite\Sprite(Pos) = LoadSprite(#PB_Any, File, Mode)
Else
DebugLog("AnimSprite::AddLoadSprite(): Error reading file (" + File + ")")
EndIf
EndIf
EndProcedure
Procedure AddGrabSprite(*AnimSprite.Mem_Struct, x, y, Width, Heigth, Pos = AnimSprite::#POS_Last, Mode = #Null)
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
EndIf
If Pos <= *AnimSprite\Frame_Max + 1 And Pos >= 0
InsSprite(*AnimSprite, Pos)
*AnimSprite\Sprite(Pos) = GrabSprite(#PB_Any, x, y, Heigth, Width, Mode)
EndIf
EndProcedure
Procedure AddCatchSprite(*AnimSprite.Mem_Struct, *Ptr, Pos = AnimSprite::#POS_Last, Mode = #Null)
Protected Sprite
If Pos < 0
Pos = *AnimSprite\Frame_Max + 1
EndIf
If Pos <= *AnimSprite\Frame_Max + 1 And Pos >= 0
Sprite = CatchSprite(#PB_Any, *Ptr, Mode)
If IsSprite(Sprite)
InsSprite(*AnimSprite, Pos)
*AnimSprite\Sprite(Pos) = Sprite
Else
DebugLog("AnimSprite::AddCatchSprite(): Sprite(@" + Str(*Ptr) + ") could not be read")
EndIf
EndIf
EndProcedure
Procedure Create()
Protected *Dummy.Mem_Struct = AllocateStructure(Mem_Struct)
If *Dummy
*Dummy\Frame_Max = -1
*Dummy\Pos = -1
*Dummy\Speed = 0
*Dummy\Sprite(0) = 0
Else
DebugLog("AnimSprite::Create(): Allocate memory failed")
EndIf
ProcedureReturn *Dummy
EndProcedure
Procedure CreateFromImages(Image, Width = -1, Heigth = -1, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black, *LoadCallBack = #Null)
Protected *AnimSprite = AnimSprite::Create()
If *AnimSprite
CopyFromImages(Image, *AnimSprite, Width, Heigth, Mode, TransparentSpriteColor, *LoadCallBack)
EndIf
ProcedureReturn *AnimSprite
EndProcedure
Procedure CreateCopy(*In.Mem_Struct, Mode = #PB_Sprite_AlphaBlending, TransparentSpriteColor = #Black)
Protected *AnimSprite = AnimSprite::Create()
If *AnimSprite
AnimSprite::Copy(*In, *AnimSprite, Mode, TransparentSpriteColor)
EndIf
ProcedureReturn *AnimSprite
EndProcedure
Procedure SwitchSprite(*AnimSprite.Mem_Struct, Pos1, Pos2)
Protected Temp_Sprite
If Pos1 <= *AnimSprite\Frame_Max And Pos1 >= 0
If Pos2 <= *AnimSprite\Frame_Max And Pos2 >= 0
Temp_Sprite = *AnimSprite\Sprite(Pos1)
*AnimSprite\Sprite(Pos1) = *AnimSprite\Sprite(Pos2)
*AnimSprite\Sprite(Pos2) = Temp_Sprite
EndIf
EndIf
EndProcedure
Procedure DelSprite(*AnimSprite.Mem_Struct, Pos)
Protected i
If Pos <= *AnimSprite\Frame_Max And Pos >= 0
If IsSprite(*AnimSprite\Sprite(Pos))
FreeSprite(*AnimSprite\Sprite(Pos))
EndIf
For i = Pos To *AnimSprite\Frame_Max
*AnimSprite\Sprite(i) = *AnimSprite\Sprite(i + 1)
Next
*AnimSprite\Frame_Max - 1
ReDim *AnimSprite\Sprite(*AnimSprite\Frame_Max)
EndIf
EndProcedure
Procedure Free(*AnimSprite.Mem_Struct)
Protected i, ret = #False
For i = 0 To *AnimSprite\Frame_Max
If IsSprite(*AnimSprite\Sprite(i))
FreeSprite(*AnimSprite\Sprite(i))
ret = #True
Else
ret = #False
DebugLog("AnimSprite::Free(): Can't free Sprite(" + Str(*AnimSprite\Sprite(i)) + ")")
Break
EndIf
Next
If ret
FreeStructure(*AnimSprite)
EndIf
ProcedureReturn ret
EndProcedure
Procedure SetSpeedDivider(Div.f)
Conf\Speed_Divider = Div
EndProcedure
Procedure.f GetSpeedDivider()
ProcedureReturn Conf\Speed_Divider
EndProcedure
Procedure AutoSpeed(Enabled = #True)
Conf\Use_Speed_Divider = Enabled
EndProcedure
EndModule