You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
17 KiB
HTML
179 lines
17 KiB
HTML
<!menue>
|
|
|
|
<!h1=l3lib Animationsklasse>
|
|
Defaults
|
|
<pre>
|
|
gfx=""; //Filename Hybrid, oder erstes File einer Sequenz
|
|
PositionList=""; //Filename einer Positionlist
|
|
colorkey=0; //schwarz ist transparent
|
|
cache=false; //Wenn true wird jedes Frame im Speicher gehalten
|
|
ckEnable=true; //default colorkey = enabled
|
|
ckFrame1Enable=true; //colorkey enabled für frame1
|
|
virtFrame1=true; //erstes frame ist virutell und wird nicht geladen
|
|
buffertype=UNI_BUFFER; //default ist unibuffer
|
|
filetype=SEQUENCE_FILE; //default, frames sind einzelne Files
|
|
holdmode=HOLD_NONE; //am Ende wird kein Frame "gehalten" angzeigt.
|
|
xpos=0;
|
|
ypos=0;
|
|
frame_width=0; //wenn 0 dann wird width automatisch gesetzt
|
|
frame_height=0; //wenn 0 dann wird height automatisch gesetzt
|
|
frame_cnt=0; //wenn 0 wird frame_cnt automatisch gesetzt
|
|
cur_frame=0; //
|
|
AnimTime=1.0; // eine sekunde
|
|
direction=0; //0=von frame 0 bis n, 1=von frame n - 0
|
|
loop=false; //kein endlos loop der animation
|
|
toggle=false; //false=nur in eine Richtung, true=ping pong
|
|
</pre>
|
|
|
|
<!h2a=anim.Play,Play - Starten der Animation,anim.play>
|
|
1. Wenn die Animtion bereits läuft bewirkt dieser Befehl nichts (auch Punkt 4 nicht).
|
|
2. Wenn die Animation nicht läuft wird sofort ab dem aktuellem Frame das abspielen gestartet.
|
|
3. Wenn der Animationstype DOUBLE_BUFFER ist, wird MSG Background::state=false verschickt.
|
|
4. Der Inhalt von StartMsg wird verschickt.
|
|
|
|
Zu 2.) Ist das aktuelle Frame 1 (cur_frame) dann beginnt die Animation mit dem Frame2 bzw. 0 je nach Inhalt von direction, der Richtungsvariable.
|
|
Zu 3.) Das verhindert das die Buffer mit der Hintergrundgrafik übermalt werden. Am Ende der Animation muss man selbst dafür sorgen das Background wieder aktiv wird, durch Background::state=true oder durch Background::gfxFilename=file (Szenenwechsel).
|
|
|
|
<!h2a=anim.Step,Step - Schrittweises Abspielen der Animation,anim.Step>
|
|
Es wird sofort das nächste Frame der Animation angezeigt und "gehalten".
|
|
Wenn die Animation bereits läuft wird die Zeit bis zum nächsten Frame gelöscht und das nächste Frame sofort angezeigt. Die Animation ist daraufhin gestoppt.
|
|
Es wird keine StartMsg verschickt. Am Ende der Animation werden die Inhalte von Fr1Msg, FrXMsg, EndMsg wie bei PLAY verschickt.
|
|
|
|
<!h2a=anim.state,state=false - Unterbrechen einer Animation,anim.state>
|
|
Wird state=false gesetzt stopped sofort die Animation. Das aktuelle Frame bleibt angezeigt. Mit state=true lässt sich der Stop wieder aufheben. state=true sollte nur verwendet werden wenn man zuvor explizit state auf false gesetzt hat. state wird vom Befehl Play und Step automatisch neben anderen Initialisierungen gesetzt.
|
|
state=false entspricht nicht dem normalen Ende einer Animation.
|
|
Auto-Statusvariable. Zeigt an ob die Animation aktiv ist oder nicht. Wirkt beim setzen sofort und wird auch automatisch gesetzt (Play, Step etc.)
|
|
|
|
- ENDE einer Animation
|
|
Nur eine gestartete oder gesteppte Animation mit Statusvariable loop ist false gesetzt kann ein "ENDE" finden. Je nach dem welche Framenummer am "ENDE" angezeigt wird verursacht das verschicken der Fr1Msg (bei Frame1) oder FrXMsg beim Frame mit der höhsten Framenummer. Auf jeden Fall wird auch die EndMsg verschickt.
|
|
Welche Framenummer am ENDE angezeigt wird hängt vom Holdmode ab (siehe holdmode).
|
|
|
|
<!h2a=anim.Update,Update - aktuelles Animframe anzeigen,anim.update>
|
|
Setzt man manuell die Variable cur_frame und will dieses Frame angezeigt bekommen ohne die Animation zu starten (z.B bei Schalterzuständen die eine Animation zwar darstellen aber die einzelnen Frames nicht als Bewegung sondern als Zustände arbeiten sollen) dann muss man den Befehl Update absetzen. Danach wird dieses aktuelle Frame dargestellt.
|
|
Besonders wichtig ist Update für das wiederherstellen von Szenen mit bestimmten gespeicherten Animations-Stellungen (Code-Schlösser, Türen ->> offen oder zu etc..) siehe SaveAnimState und GetAnimState.
|
|
|
|
<!h2a=anim.gfx,anim.gfx=path - Animationsfiles angeben,anim.gfx>
|
|
File ist das erste Frame einer Animations-Sequenz die in als einzelne Bilder durchnummeriert vorhanden ist. Die Nummer muss dabei mindestens zweistellig und darf maximal 5 Stellig sein. Z.B masternanim00.tga, manim-a-001.tga etc.
|
|
Das File muss aber keine Nummer enthalten. In diesem Fall hat die Animation dann nur ein Frame. Ist eine Nummer enthalten ... und frame_cnt=0 ... dann wird ab der Nummer nach weiteren Files, wo die Fortlaufende Nummerierung passt , gesucht und frame_cnt wird gesetzt. Ist kein Pfad angegeben dann wird aus dem Root::AnimDir Verzeichnis gelesen.
|
|
Möchte man innerhalb von Root::AnimDir eine Unterverzeichnis ansprechen so schaut die Pfadangabe so aus : gfxFilename=tron/links/can0100-a-001.tga <- vor tron kein ./ oder ../
|
|
Besonderheit: Das erste File einer Sequenz darf fehlen! Da mit virtFrame1=true dieses Frame vom Hintergrund "geborgt" wird und daher kein Laden dieses Frame notwenig ist. (siehe virtFrame1). D.h aber auch das es keine Fehlermeldung gibt falls das erste Frame fehlt bzw. nur falsch geschrieben ist.
|
|
Statusvariable, wirkt beim beim nächsten Frame.
|
|
|
|
(Future use) PositionList=file - Positionlistfile angeben
|
|
File ist eine Positionsdatei von Rechtecken die einzelen Frames einer Animation beschreiben für den Fall das filetype=HYBRID_FILE ist. Hybrid-Files sind Grafikdateien die alle Animationsframes beinhalten.
|
|
|
|
<!h2a=anim.colorkey,colorkey=RGB - Colorkey Farbe angeben,anim.colorkey>
|
|
Setzt die neue Colorkey Farbe. Wenn ckEnalbe=true wird diese Farbe transparent erscheinen bzw. ckEnableFrame1=true wird diese Farbe im Frame1 transparent erscheinen. Defaultmäßig ist der Colorkey enabled und die Colorkey Farbe ist schwarz.
|
|
RGB ist die Farbe in Hexschreibweise: 0xFF00FF (rot grün blau) auch ohne "0x"
|
|
Statusvariable und wirkt beim setzen sofort.
|
|
|
|
<!h2a=anim.ckEnable,ckEnable=true|false - Colorkey Aktivieren,anim.ckEnable>
|
|
Gilt für alle Frames ausser dem Frame1 (siehe ckFrame1Enable). Wenn "true" werden alle Pixel mit der Farbe colorkey transparent geblittet.
|
|
Statusvariable, wirkt beim nächsten Frame.
|
|
ckFrame1Enable=true|false - Colorkey für Frame1 Aktivieren
|
|
Gilt nur für Frame1. Wenn "true" werden alle Pixel mit der Farbe colorkey transparent geblittet.
|
|
Statusvariable, wirkt beim nächsten Frame.
|
|
|
|
<!h2a=anim.virtFrame1,virtFrame1=true|false - Virtuell-Flag für Frame 1setzen,anim.virtFrame1>
|
|
Für viele Szenen gilt das das erste Frame bereits im Hintergrund enthalten ist. Ein gutes Beispiel sind die Türen. Diese Türen sieht man überall geschlossen, also wenn man auf eine Türanimation stößt existiert das "erste Frame" der Animation bereits als Hintergrundbild.
|
|
In diesem Fall braucht man die Animation erst ab Frame2 und setzt das virtFrame1 auf true. Beim Abspielen wird das Laden und anzeigen von Frame1 unterdrückt, sonst besteht kein Unterschied.
|
|
Beispiel Hebel: Ein Hebel hat zwei Positionen. Die erste Position ist im Hintergrundbild, die zweite ist "Frame2" als Animation abgespeichert.
|
|
Achtung: gfxFilename muss aber so angegeben werden als ob das Frame1 existiert!
|
|
D.h hebel-001.tga hebel-002.tga (obwohl hebel-001.tga im Hintergrundbild, es wird aber nicht geladen). Hebel-001.tga muss nicht einmal existieren, aber angeben muss man es!.
|
|
Statusvariable, wirkt beim nächsten Frame.
|
|
|
|
<!h2a=anim.buffertype,buffertype=BUFFER - Buffer Type zur Anzeige angeben,anim.buffertype>
|
|
Mögliche Buffertypen sind : UNI_BUFFER, DOUBLE_BUFFER, SINGLE_BUFFER
|
|
- UNI_BUFFER
|
|
Default Einstellung. UNI_BUFFER Animationen sind nicht optimierte Animationen mit oder ohne Colorkey. Nur im UNI_BUFFER Modus ist das setzen des aktuellen Frames (cur_frame) erlaubt.
|
|
- DOUBLE_BUFFER
|
|
Für Double-Buffer optimierte Animation. Die Frames werden mit Colorkey geblittet (Achtung, colorkeys enablen!). Die Optimierten Frames werden mithilfe von AsinDes hergestellt. Die Optimierung bewirkt beschleunigtes Einladen von Animationsframes da diese durch die Optimierung sehr große transparente Flächen beinhalten, die sich dadurch sehr gut packen lassen. Die transparenten Flächen setzen aber den Bufferzustand des jeweils Vorletzen Frames vorraus.
|
|
Besonderheit: Bei "Play" einer DOUBLE_BUFFER Animation wird dem Background die state=false Message geschickt. Nur so wird verhindert das die Double-Buffer vom Screen durch das Backgroundobjekt zerstört werden.
|
|
Auch sollte man beim Abspielen einer DOUBLE_BUFFER Animation darauf Achten das der LinkManager Disabled ist. Am Ende der Animation sollte man Background::state=true absetzen. Setzen des aktuellen Frames mit cur_frame ist nicht erlaubt und erzeugt nur eine Fehlermeldung auf der Konsole.
|
|
- (Future use) SINGLE_BUFFER
|
|
Dieser Buffertyp erlaubt das abspielen einer Animation ohne PageFlip, das heißt jedes Frame wird in den gleichen Buffer geblittet und setzt dabei den vorherigen Zustand voraus. Die schnellste Optimierungsmöglichkeit aber aufgrund der guten Ergebnisse mit UNI_BUFFER und DOUBLE_BUFFER nicht weiter ausgebaut.
|
|
|
|
Der Buffertype sollte vor einem Play oder Step gesetzt werden und nicht während einer Animation.
|
|
|
|
<!h2a=anim.filetype,filetype=SEQUENCE_FILE - Animations-File-Typ setzen,anim.filetype>
|
|
Damit wird entweder eine Sequenz von durchnummerierten Einzelfiles der Animations-Frames oder ein HYBRID_FILE Filetyp angegeben. Hybrid-Files sind Grafiken die alle Animationsframes beinhalten (siehe PositionList). Der Filetyp muss vor der gfx=filename Message abgesetzt werden.
|
|
|
|
<!h2a=anim.xpos,xpos=0 - X-Position der Animation setzen,anim.xpos>
|
|
Die X-Positon der Animation (linke obere Ecke). Kann auch ausserhalb des Bildschirms liegen. Statusvariable, wirkt sofort.
|
|
|
|
<!h2a=anim.ypos,ypos=0 - Y-Position der Animation setzen,anim.ypos>
|
|
Die Y-Positon der Animation (linke obere Ecke). Kann auch ausserhalb des Bildschirms liegen. Statusvariable, wirkt sofort.
|
|
|
|
<!h2a=anim.frame_width,frame_width=0 - Breite der Animation setzen,anim.frame_width>
|
|
Die Breite der Animation kann explizit gesetzt werden. Ist der Wert größer oder kleiner als die tatsächliche Breite der Animation wird nicht gestreckt sondern ausgelassen bzw. ausgeschnitten. Wird die Breite auf 0 gesetzt (default) dann wird beim erstmaligem Zugriff auf ein Animationsframe automatisch die Breite vom File ausgelesen.
|
|
Auto-Statusvariable, wirkt beim nächsten Frame. Wird automatisch gesetzt wenn 0.
|
|
|
|
<!h2a=anim.frame_height,frame_height=0 - Höhe der Animation setzen,anim.frame_height>
|
|
Die Höhe der Animation kann explizit gesetzt werden. Ist der Wert größer oder kleiner als die tatsächliche Höhe der Animation wird nicht gestreckt sondern ausgelassen bzw. ausgeschnitten. Wird die Höhe auf 0 gesetzt (default) dann wird beim erstmaligem Zugriff auf ein Animationsframe automatisch die Höhe vom File ausgelesen.
|
|
Auto-Statusvariable, wirkt beim nächsten Frame. Wird automatisch gesetzt wenn 0.
|
|
|
|
<!h2a=anim.frame_cnt,frame_cnt=0 - Anzahl der Animations-Frames festlegen,anim.frame_cnt>
|
|
Wird frame_cnt auf 0 gesetzt dann wird automatisch beim setzen des Animfiles (gfxFilename) die Anzahl der einzelnen Frames eruiert (siehe gfxFilename). Dieses Suchen nach der Anzahl dauert nur eine kurze Zeit kann aber durch explizites setzen von frame_cnt verhindert werden. Wichtig ist, das vor gfxFilename frame_cnt gesetzt wird. Tip: Einmal die Animation abspielen, dannach den Wert von frame_cnt auslesen und im Szenefile dann direkt vor der gfxFilename Message setzen.
|
|
Ändert man frame_cnt nach dem Befehl gfxFilename dann wird dieser Wert ungeprüft übernommen. Sind weniger Frames vorhanden als im frame_cnt angegeben spielt die Animation ganz normal "alle" Frames ab, die Files die nicht geladen werden können erzeugen nur eine Fehlermeldung auf der Konsole.
|
|
Auto-Statusvariable, wirkt ab dem nächsten Frame. Wird automatisch gesetzt wenn 0.
|
|
|
|
<!h2a=anim.cur_frame,cur_frame=0-xx - Setzen der aktuellen Frame-Nummer,anim.cur_frame>
|
|
Alle Animationsframes sind durchnummeriert. Das erste Frame hat die Nummer1 das zweite die Nummer zwei das letzte die Nummer X (normalerweise entspricht X dann den Wert von frame_cnt).
|
|
Mit cur_frame kann man die aktuelle Frame-Nummer setzen. Das bedeutet das beim nächsten Frame die Framenummer um eins höher, oder niedriger je nach direction, ist. Wenn man cur_frame auf 0 setzt wird bei einer loop=true Animation mit direction=DIRECTION_UP das erste Frame angezeigt und mit direction=DIRECTION_DOWN das letzte Frame angezeigt.
|
|
|
|
Das aktuelle Frame kann während der Animation gesetzt werden.
|
|
Allerdings ist das nur in UNI_BUFFER Animationen erlaubt. UNI_BUFFER Animation sind vom Hintergrund unabhängig und können daher in beliebiger Frame-Reihenfolge abgespielt werden.
|
|
Setzt man cur_frame ohne aktive Animation dann wird bei Play oder Step ab dieser Position abgespielt.
|
|
Auto-Statusvariable, wirkt ab dem nächsten Frame. Wird automatisch während der Animation auf die jeweils aktuelle Frame-Nummer gesetzt.
|
|
|
|
<!h2a=anim.direction,direction=DIRECTION_[UP| DOWN] - Abspielrichtung setzen,anim.direction>
|
|
Setzt die Abspielrichtung. Direction_UP spielt von Frame1 bis FrameX, Direction_DOWN spielt von FrameX bis Frame1.
|
|
Auto-Statusvariable, wirkt sofort. Bei toggle=true wird die aktuelle Richtung bei Frame1 und FrameX automatisch umgekehrt und eingetragen.
|
|
|
|
<!h2a=anim.cache,cache=true|false - Sequenz Filechache setzen,anim.cache>
|
|
Wenn true dann wird jedes Frame im Speicher gehalten bis eine neue Szene aufgebaut wird.
|
|
Einzusetzen wenn man mehrere Animationen in einer Szene hat und das Laden der Frames in Summe schon zuviel Zeit verbraucht. Bringt effektiv nur etwas wenn die Animation im LOOP abgespielt wird.
|
|
Statusvariable, wirkt sofort.
|
|
|
|
<!h2a=anim.loop,loop=true|false - Endlos Loop oder OneShot setzen,anim.loop>
|
|
Wenn loop=true wird die Animation im endlos-loop abgespielt. Dabei wird beim letzten und beim ersten Frame automatisch die Animation neu gestartet. Wichtig ist der Wert von toggle. Ist toggle=true wird beim ersten und beim letzten Frame die Abspielrichtung umgestellt und die Animation wird rückwärts wieder abgespielt. (Ping Pong).
|
|
Wenn loop=false endet die Animation beim erreichen des ersten oder letzten Frames. Auch hier wird aufgrund von toggle die Richtung beibehalten oder umgekehrt, sodass ein neuer Play Befehl die Animation in die entsprechende Richtung startet. Nur wenn die Animation endet, also loop=false, dann wird der Inhalt der Variable EndMsg verschickt sowie der Inhalt von Fr1Msg, falls die Anmation bei Frame1 stoppte, oder den Inhalt von FrXMsg, falls die Animation beim letzten Frame stoppte.
|
|
Statusvariable, wirkt bei Frame1 und beim letzten Frame.
|
|
|
|
<!h2a=anim.toggle,toggle=true|false - Ping-Ping oder Ping Pong,anim.toggle>
|
|
Wenn true wird bei Frame1 und beim letzten Frame (=FrameX) die variable direction umgekehrt. Wenn false dann bleibt direction unverändert.
|
|
Statusvariable, wirkt bei Frame1 und beim letzten Frame.
|
|
|
|
<!h2a=anim.AnimTime,AnimTime=1.0 - Gesamtablaufzeit der Animation setzen,anim.AnimTime>
|
|
AnimTime beschreibt die Zeit die für das Abspielen der Animation mit allen Frames dauern soll. Die Zeit wird in Sekunden angegeben und darf den Wert 0.1 Sekunde nicht unterschreiten (kleinere Werte werden auf 0.1 korrigiert). Die Zeit für ein Frame berechnet sich dann aus (AnimTime / frame_cnt) und bildet den Richtwert für die Abspielroutine.
|
|
Daraus ergibt sich das frame_cnt unbedingt gesetzt sein muss bevor AnimTime gesetzt werden kann. Ist frame_cnt zum Zeitpunkt vom Befehl AnimTime gleich 0 wird eine default-Framezeit von 0.2 sekunden verwendet (AnimTime ist dann frame_cnt*0.2sec). frame_cnt kann explizit gesetzt oder implizit durch das setzen der Variable gfxFilename. Auf langsamen Rechner wird die Abspielzeit unter Umständen nicht erreicht und die Animation wird um sehr viel langsamer abgespielt als angegeben. Das kommt daher weil beim Abspielen der Animation keine Frames ausgelassen werden. Daher die AnimZeit immer für schnelle Rechner einstellen, auf langsamen bringt ein Wert von 0.1sec für 40 Frames nichts, die Animation wird dadurch nicht schneller abgespielt und auf schnellen Rechnern ist die Animation dann viel zu schnell.
|
|
Statusvariable, wirkt sofort.
|
|
|
|
<!h2a=anim.holdmode,holdmode=HOLD_* - Frameanzeige am Ende einer Animation setzen,anim.holdmode>
|
|
Am Ende einer Animtion kann durch die variable holdmode bestimmt werden ob bzw. welches Frame angezeigt bleiben soll.
|
|
Optionen:
|
|
HOLD_STARTFRAME - das bei "Play" erste sichtbare Frame wird gehalten
|
|
HOLD_ENDFRAME - das zuletzt angezeigte Frame wird gehalten
|
|
HOLD_FIRST - das Frame1 wird gehalten
|
|
HOLD_LAST - das FrameX (höhste Framenummer) wird gehalten
|
|
HOLD_NONE - kein Frame wird gehalten, kein Frame mehr sichtbar
|
|
HOLD_CURRENT - das aktuelle wird gehalten! Achtung ist implizit immer bei gestoppten Animationen der Fall
|
|
Statusvariable, wirkt am Ende der Animation
|
|
|
|
<!h2a=anim.StartMsg,StartMsg= - Automessage setzen,anim.StartMsg>
|
|
Der Inhalt von StartMsg wird bei Play automatisch verschickt.
|
|
Statusvariable, wirkt beim Befehl Play.
|
|
|
|
<!h2a=anim.EndMsg,EndMsg= - Automessage setzen,anim.EndMsg>
|
|
Der Inhalt von EndMsg wird am Ende der Animation automatisch verschickt. Die EndMsg wird immer vor einer Fr1Msg oder FrXMsg verschickt.
|
|
Statusvariable, wirkt bei ENDE einer Animation.
|
|
|
|
<!h2a=anim.Fr1Msg,Fr1Msg= - Automessage setzen,anim.Fr1Msg>
|
|
Wenn am Ende der Animation das aktuelle Frame 1 ist (cur_frame=0) dann wird der Inhalt von Fr1Msg automatisch verschickt. Ob eine Animation mit cur_frame=0 endet hängt wesentlich von der variable holdmode ab. (siehe holdmode).
|
|
Statusvariable, wirkt bei ENDE einer Animation.
|
|
|
|
<!h2a=anim.FrXMsg,FrXMsg= - Automessage setzen,anim.FrXMsg>
|
|
Wenn am Ende der Animation das aktuelle Frame X ist (cur_frame=frame_cnt) dann wird der Inhalt von FrXMsg automatisch verschickt. Ob eine Animation mit cur_frame=frame_cnt endet hängt wesentlich von der variable holdmode ab. (siehe holdmode).
|
|
Statusvariable, wirkt bei ENDE einer Animation.
|
|
|