Programmierung von Animationseffekten
9) Wiederaufnahme von abgebrochenen Animationen
Wenn eine Animation nach einem Abbruch wieder gestartet wird, so prüft monzoom®, ob zu der Job-Datei eine AF1 und eine AF2-Datei existiert. Wenn ja, so ließt er die Objekte, die in der AF2-Datei stehen, und ordnet sie anhand der Informationen aus der AF1-Datei den AnimFX-Objekten zu. Dies geschieht wieder mit einem Skript-Aufruf:
SET_OBJS <animfx_obj> <obj1> <obj2> <obj3> ...
Das AnimFX bekommt hier die Namen der Objekte in der gleichen Reihenfolge geliefert, in dem
es sie beim GET_OBJS-Aufruf angegeben hat, und kann sie dann bei sich in den internen Objekt-variablen abspeichern. Am Ende muß wieder OK als String geliefert werden.
Beispiel: Pen3D
oben im skript wird nach modus unterschieden:
IF_STR_EQUAL_GOTO modus SET_OBJ set_objs
...
>set_objs:
;
GET_PARAM_NR 3
GET_RESULT poly_obj
AFX_SET_OBJ ich 2 poly_obj
RETURN OK
Wichtig!
Folgender Dinge müssen AnimFX-Objekte unbedingt beachten, wenn sie mit Objekte arbeiten, die zwischengespeichert werden sollen:
1) Der SET_OBJS Aufruf erfolgt vor dem START-Aufruf.
Normalerweise werden die Objekte, um die es geht, im START-Aufruf erzeugt. Deshalb muß im START-Aufruf ein Test erfolgen, ob die interne Objekt-variable, die das Objekt speichert, schon gesetzt ist. Wenn ja, dann war zuvor ein SET_OBJS-Aufruf, bei der das Objekt eingeladen wurde und es muß nicht mehr erzeugt werden.
Oder man könnte eine interne Integer-Variable vereinbaren, die ein Flag enthält, ob ein SET_OBJS-Aufruf erfolgt ist. Die Variable sollte man bei INIT immer auf 0 setzen und bei einem SET_OBJS-Aufruf auf 1. Bei START kann man dann, bevor man das benötigte Objekt erzeugen will, diese Variable testen, und wenn sie ungleich 0 ist, dann ist das Objekt per SET_OBJS schon definiert und muß nicht mehr erzeugt werden.
Als Beispiel diene hier wieder das Pen3D-AnimFX.
Das erzeugt ja einen Schlauch, der die Flugbahn eines beliebigen anderen Geo-Objektes X anzeigt. Dies geschieht, indem einfach das AnimFX beim Start ein 3D-Polygon erzeugt und bei jedem Bild die Position von X ermittelt, die als Punkt beim 3D-Polygon anfügt und dann zu dem 3D-Polygon einen Schlauch erzeugt.
Die Information der Flugbahn ist also in dem 3D-Polygon enthalten, daher wird das Polygon auch bei Abbruch gespeichert.
>start:
; prüfen, Objektvariable schon gesetzt,
; dann wurde sie nach einem Abbruch schon geladen
; und ich muß sie hier nicht mehr erzeugen
; Polygon wird in Objektvariable Nr. 2 gespeichert
AFX_GET_OBJ ich 2
GET_RESULT poly_obj
IF_STR_NOT_EQUAL_GOTO poly_obj ---- start_weiter
; aha, es existiert noch nicht, also erzeuge ich eines
; 3D-Polygon-obj erzeugen
OBJ_NEW poly 5
GET_RESULT xx_poly
AFX_SET_OBJ ich 2 xx_poly
RETURN OK
>start_weiter:
; hier speichere ich einen Wert in einer internen Variable anhand
; derer ich bei PRERENDER sehen kann, daß ich hier keinen Punkt anfügen muß
AFX_SET_INT ich 0 1
RETURN OK
2) Ein AnimFX sollte sich auch genau überlegen, wie es auf den PRERENDER-Aufruf direkt nach der Wiederaufnahme der Animation reagiert.
Üblicherweise werden die aktuellen Manipulationen zu einem bestimmten Bild im PRERENDER-Aufruf vorgenommen. Die Objekte, die mit GET_OBJS zwischengespeichert wurden und mit SET_OBJS wieder geladen wurden, enthalten ja bereits den Zustand für das aktuelle Bild. Diese hatten bereits ihr PRERENDER, bevor das Bild abgebrochen wurde (dann wurden sie gespeichert und vor dem Weiterrechnen wieder geladen).
Das AnimFX sollte sich dafür eine interne Integer-Variable reservieren, in dem es speichert, ob es nach einem Abbruch neu gestartet wurde.
© 1997 Oberland Computer