R-PG Animationsformat

Bitte unbedingt den allgemeinen Aufbau des Formats durchlesen, hilft ungemein bei Verständnisschwierigkeiten!!!

1) Allgemeiner Aufbau/Formatübersicht
2) Anleitung für Editornutzer (noch nicht implementiert)
3) Anleitung/Hinweise für Programmierer (vorläufig)
masterk@r-pg.net

Allgemeiner Aufbau/Formatübersicht
Das Rani-Format (wem ein guter Name einfällt, melden) soll sämtliche Animationsinformationen für das R-PG speichern. Wichtig: das Format speichert nur die Informationen, nicht die Bilddaten an sich. Diese können über beliebig viele Bilder verteilt sein.
Hier nun der grundsätzliche Aufbau des Formats, anschliessend eine kleine Auflistung der Vorteile im Vergleich zu den traditionellen Animationen.

- jede Animationsdatei speichert eine Animation (Scene)

- jede Scene enthält eine Picturelist

- jedes Picture der Picturelist enthält einen Verweis auf eine reale Bilddatei sowie eine eindeutige interne ID (wird zur Laufzeit zugewiesen)

- jede Scene hat eine Imagelist, welche eine beliebige Anzahl an Images enthält

- ein Image ist definiert als: Verweis auf ein Picture der Picturelist sowie ein RECT (rechteckiger Bildausschnitt) zur beliebigen Auswahl einzelner Bildabschnitte

- die Scene enthält eine beliebige Anzahl an Sprites

- jede Scene besteht aus einer beliebigen Anzahl an Frames (einzelne Animationsstufen)

- pro Frame kann jedes Sprite an eine beliebige Position im Frame gesetzt werden. Sprites können in jedem Frame ein anderes Image zugewiesen bekommen (für Bitmapanimationen).

- jedes Sprite besitzt weitere Eigenschaften, die in jedem Frame einzeln gesetzt werden können:

+ Rotationswinkel

+ Alphawert

+ Skalierungswert [geplant]

+ Farbwert (für den Vertexshader)

+ Aktiv (legt fest, ob ein Sprite sichtbar ist oder nicht)

- beim Rendern können alle benötigten Daten (Textur-IDs, Position, Eigenschaften) abgefragt werden (in einer Schleife), so dass die Renderengine die Informationen erhält, was wie gerendert werden soll

Vorteile:

- als Bilder werden nur noch die wirklich benötigten Flächen gespeichert, "leere" Flächen müssen nicht als Bild gespeichert werden (VRam ist nicht unendlich gross)

- Bilder können beliebig oft für verschiedene Animationen verwendet werden. Wird ein Bild in 10 verschiedenen Animationen verwendet, wird dieses trotzdem nur einmal geladen

- traditionelle Bitmapanimationen sind weiterhin möglich und werden auch genutzt werden müssen. Setzt man die Grösse eines Sprite auf die Scenegrösse, kann man ganz normale Animationen erstellen, die einzelnen Animationsphasen können auf beliebig viele Bilddateien verteilt sein.
Das Format "verknüpft" praktisch klassische Bitmapanimation mit Objektbasierter (die Sprites sind "Objekte") Animation

- die Animationen sind per Script zur Laufzeit veränderbar. So könnte zB für ein Rätsel die Farbe eines Sprites je nach Aktion anders sein (ein simples Beispiel).

Anleitung/Hinweise für Programmierer
[Achtung, nur vorläufig!]
Die Implementierung der Scenes ist noch grössenteils unoptimiert, speziell was Geschwindigkeit angeht. Bisher werden zB beim Zeichnen der Sprites ALLE durchlaufen, egal ob sie enabled sind oder nicht (sorry, vor der Dusmania schaff ich das nicht mehr).
Desweiteren müsste noch die Option implementiert werden, welche die Spritereihenfolge festlegt, bisher wird Sprite1 einer Scene als erstes gerendert, dann Sprite2 usw.
Da meine Zeit eng ist, kurze Anleitung:
1)

    Private Scene As New clsSceneManager 'deklarieren (ok *g*)

2)

    Private TexturID As Single
    Private SpriteFarbe As Long, SpriteAlpha As Single
    Private SpriteHeight As Single, SpriteWidth As Single
    Private DestX As Single, DestY As Single
    Private SpriteAngle As Single
    'Ein paar Hilfsvariablen, fragt Smoki, warum ne Farbe Single sein muss

3)

    Scene.Init App.Path & "\"
    'initialisieren, Bildpfad angeben. Später wären evtl mehrere Pfade sinnvoll

4)

    Scene.AddScene "test8.rani"
    'Scenes hinzufügen

5)

    For i = 1 To Scene.GetPictureCount
        Scene.SetPictureTextureID i, TexturePool.AddTexture(App.Path & "\" & Scene.GetPictureFile(i), RGB(255, 0, 255))
    Next i
    'die Texturen festlegen, genutzt wird Smokis Texturpool

6)

    'Alle Scenes rendern, die Abfrage, was gerendert werden muss, muss de Engine erledigen (klar)
           For J = 1 To Scene.GetSceneCount
                Scene.NextFrame J
                For i = 1 To Scene.GetSpriteCount(J)
                    'Debug.Print Scene.GetSpriteProperty(i, bolEnabled)
                    If Scene.GetSpriteProperty(i, J, bolEnabled) Then
                        'Debug.Print "rendern"
                        TexturID = Scene.GetSpriteTextureID(J, i)
                        SpriteFarbe = Scene.GetSpriteProperty(i, J, lColor)
                        SpriteAlpha = Scene.GetSpriteProperty(i, J, bAlpha)
                        DestX = Scene.GetSpriteProperty(i, J, lXPos)
                        DestY = Scene.GetSpriteProperty(i, J, lYPos)
                        SpriteHeight = Scene.GetSpriteImageRect(J, i).bottom - Scene.GetSpriteImageRect(J, i).Top
                        SpriteWidth = Scene.GetSpriteImageRect(J, i).Right - Scene.GetSpriteImageRect(J, i).Left
                        SpriteAngle = Scene.GetSpriteProperty(i, J, iAngle)
                        'das CSng(SpriteFarbe) is nich meine schuld ;)
                        TexturePool.RenderTexture TexturID, DestX, DestY, SpriteWidth, SpriteHeight, SpriteWidth, SpriteHeight, CSng(Scene.GetSpriteImageRect(J, i).Left), CSng(Scene.GetSpriteImageRect(J, i).Top), SpriteAlpha, , CSng(SpriteFarbe), CSng(SpriteFarbe), CSng(SpriteFarbe), CSng(SpriteFarbe), SpriteAngle
                    End If
                Next i
            Next J