Animation-Lib

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Freak123

Betreff: Animation-Lib

BeitragDi, Apr 10, 2012 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei eimen kleinen Produkt ist diese Animationslib als Nebenprodukt herausgekommen.

Im großen und ganzen steuert die Lib den Ablauf der Animationen eines AnimationsObjekts.

Code: [AUSKLAPPEN]

;Animation
; Created by Freak123
; Last updated:

Const ANIMATIONOBJECT_MAXANIMATIONS = 20
Type TAnimationObject
   Field image
   
   Field animation.TAnimation[ANIMATIONOBJECT_MAXANIMATIONS]
   Field animationcount
   
   Field activeanimation.TAnimation
   Field actualframe
End Type

Type TAnimation
   Field from, end
   Field parent.TAnimationObject
End Type

Function CreateAnimationObject.TAnimationObject( image )
   Local ao.TAnimationObject=New TAnimationObject
   
   ao\image=image
   
   Return ao
End Function

Function AddAnimation.TAnimation( parent.TAnimationObject, start, End )

If parent\animationcount=ANIMATIONOBJECT_MAXANIMATIONS Then Return Null

Local a.TAnimation=New TAnimation
   
   a\from=start
   a\End=End
   
   a\parent=parent
   a\parent\animation[a\parent\animationcount]=a
   a\parent\animationcount=a\parent\animationcount+1
   
   Return a
End Function

Function StartAnimation( anim.TAnimation )
   
   anim\parent\activeanimation=anim
   anim\parent\actualframe=anim\from
   
End Function

Function StopAnimation( anim.TAnimation )
   
   anim\parent\activeanimation=Null
   
End Function

Function RemoveAnimation( anim.TAnimation )
   
   Local p.TAnimationObject = anim\parent
   Local found=False
   For i=0 To p\animationcount
      Local a.TAnimation=p\animation[i]
      If found=True Then
         p\animation[i-1]=p\animation[i]
      End If
      If a=anim Then found=True
   Next
   p\animationcount=p\animationcount-1
   
End Function


Function RenderAnimation( animobj.TAnimationObject, x, y, update=1 )
   
   If animobj\activeanimation<>Null Then
      DrawImage animobj\image, x, y, animobj\actualframe
      If update Then UpdateAnimation( animobj )
   End If
   
End Function

Function UpdateAnimation( animobj.TAnimationObject )
   
   If animobj\activeanimation<>Null Then
      animobj\actualframe=animobj\actualframe+1
      If animobj\activeanimation\End<animobj\actualframe Then animobj\activeanimation=Null
   End If
   
End Function


Function IsAnimationActive( animobj.TAnimationObject )
   Return animobj\activeanimation<>Null
End Function

Function GetAnimationLength( anim.TAnimation )
   Return anim\End-anim\from
End Function



Download-Link(mit Beispielen): https://www.blitzforum.de/upload/file.php?id=11632

Vielleicht baue ich noch Loops und sowas ein, wenn es mein Spiel benötigt, oder der Druck der Community zu groß wird. Very Happy

Ich hoffe, dass es nichts ausmacht, dass ich bei den Beispielen eine Animation vom derzeit laufenden BAC genommen habe.(entschuldigung an JOo)

Viel Spass damit

Lg Freak123

PacMani

BeitragMi, Apr 11, 2012 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön Smile Kommt mir außerdem bekannt vor: Hier zu dem Thema mal meine nie ganz (das letzte Prozent von 99% fehlt) fertiggestellte Animations-Bb. Wollte ich mal separat posten. Aber das passt sich hier ja auch ganz super.
Code: [AUSKLAPPEN]
;Animation ########################################################################################
Type Animation
    Field AnimImage     ;Das zugehörige Animationsbild
    Field Kind          ;Der Animationstyp
    Field FrameStart    ;Der Index des ersten Frames (Offset)
    Field FrameCount    ;Anzahl aller Frames
    Field FrameCurrent# ;Der Index des aktuellen Frames
    Field FrameSpeed#   ;Geschwindigkeit der Animation
    Field Loop          ;Wiederholt sich die Animation?
    Field Stopped       ;Gibt an, ob die Animation noch läuft
End Type


;Variablen & Konstanten ===========================================================================

;Bemessungen --------------------------------------------------------------------------------------
Global FrameDelay        ;Dauer in Millisekunden zwischen Framewechsel
Global FrameTimer        ;Aktueller Zähler für Framewechsel
Global FrameElapsedCount ;Anzahl hochgerechneter Frames für externe Anwendung

;Animationstypen ----------------------------------------------------------------------------------
Const KndAnimationForward   = 1 ;Vorwärtslaufende Animation
Const KndAnimationBackward  = 2 ;Rückwärtslaufende Animation
Const KndAnimationAlternate = 4 ;Hin- und herlaufende Animation


;Funktionen =======================================================================================

;Richtet den Animationszeitgeber ein --------------------------------------------------------------
Function InitializeAnimations(TimerDelay)
    FrameDelay = TimerDelay
    FrameTimer = StartTime - 1
End Function

;Aktualisiert alle Animationen --------------------------------------------------------------------
Function UpdateAnimations()
    FrameElapsedCount = 0
    While StartTime > FrameTimer
        FrameTimer = FrameTimer + FrameDelay
        FrameElapsedCount = FrameElapsedCount + 1
        Local FoundAnimation.Animation
        For FoundAnimation = Each Animation
            UpdateAnimation(FoundAnimation)
        Next
    Wend
End Function

;Erstellt eine Animation --------------------------------------------------------------------------
Function CreateAnimation.Animation(AnimImage, Kind, FrameCount, FrameStart = 0, FrameSpeed# = 1, Loop = True)
    Local NewAnimation.Animation = New Animation
   
    NewAnimation\AnimImage = AnimImage
    NewAnimation\Kind = Kind
    NewAnimation\FrameStart = FrameStart
    NewAnimation\FrameCount = FrameCount
    NewAnimation\FrameSpeed = FrameSpeed
    NewAnimation\Loop = Loop
   
    Return NewAnimation
End Function

;Aktualisiert eine Animation ----------------------------------------------------------------------
Function UpdateAnimation(Instance.Animation)
    ;Wenn Animation beendet wurde, keine Aktualisierungen mehr durchführen
    If Instance\Stopped Then
        Return
    End If
   
    ;Nächsten Frame berechnen
    Select Instance\Kind
        Case KndAnimationForward
            Instance\FrameCurrent = Instance\FrameCurrent + Instance\FrameSpeed
            If Instance\FrameCurrent >= Instance\FrameCount - 1 Then
                If Instance\Loop Then
                    Instance\FrameCurrent = (Instance\FrameCurrent + Instance\FrameSpeed) Mod Instance\FrameCount
                Else
                    Instance\FrameCurrent = Instance\FrameCount - 1
                    Instance\Stopped = True
                End If
            End If
        Case KndAnimationBackward
            Instance\FrameCurrent = Instance\FrameCurrent - Instance\FrameSpeed
            If Instance\FrameCurrent <= 0 Then
                If Instance\Loop Then
                    Instance\FrameCurrent = Instance\FrameCount - 1
                Else
                    Instance\FrameCurrent = Instance\FrameStart
                    Instance\Stopped = True
                End If
            End If
        Case KndAnimationAlternate
            If Instance\FrameCurrent >= Instance\FrameCount - 1 Then
                If Instance\Loop Then
                    Instance\FrameCurrent = -Instance\FrameCurrent
                Else
                    Instance\Stopped = True
                End If
            End If
            Instance\FrameCurrent = Instance\FrameCurrent + Instance\FrameSpeed
    End Select
End Function

;Zeichnet eine Animation mit Transparenzmaske -----------------------------------------------------
Function DrawAnimation(Instance.Animation, X, Y)
    DrawImage(Instance\AnimImage, X, Y, Abs(Instance\FrameCurrent) + Instance\FrameStart)
End Function

;Zeichnet eine Animation ohne Transparenzmaske ----------------------------------------------------
Function DrawAnimationBlock(Instance.Animation, X, Y)
    DrawBlock(Instance\AnimImage, X, Y, Abs(Instance\FrameCurrent) + Instance\FrameStart)
End Function

;Zeichnet einen Ausschnitt einer Animation mit Transparenzmaske -----------------------------------
Function DrawAnimationRect(Instance.Animation, X, Y, RectX, RectY, RectWidth, RectHeight)
    DrawImageRect(Instance\AnimImage, X, Y, RectX, RectY, RectWidth, RectHeight, Abs(Instance\FrameCurrent) + Instance\FrameStart)
End Function

;Zeichnet einen Ausschnitt einer Animation ohne Transparenzmaske ----------------------------------
Function DrawAnimationBlockRect(Instance.Animation, X, Y, RectX, RectY, RectWidth, RectHeight)
    DrawBlockRect(Instance\AnimImage, X, Y, RectX, RectY, RectWidth, RectHeight, Abs(Instance\FrameCurrent) + Instance\FrameStart)
End Function

;Löscht eine Animation ----------------------------------------------------------------------------
Function DeleteAnimation(Instance.Animation)
    Delete Instance
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group