Programmierung von Animationseffekten
4) Interne Objektvariablen (Objektzeiger)
Hier sind einige, besondere Anmerkungen nötig:
Ein AnimFX-Objekt braucht interne Objektvariablen (Zeiger auf andere Objekte), da fast immer andere Objekte erzeugt oder manipuliert werden müssen, und interne Objektzeiger die einzige Möglichkeit sind, sich diese zwischen den Aufrufen des Skripts zu merken.
Objektzeiger werden mit dem vierten Parameter (<n_obj>) beim Aufruf von
AFX_ALLOK_INTERN_VARS <afx_obj> <n_real> <n_int> <n_obj>
reserviert.
Objektzeiger können belegt werden mit
AFX_SET_OBJ <afx_obj> <nr> <objekt_name>
wobei <nr> die Nummer der Objektzeigervariable ist.
Objektzeiger können auch gelöscht werden mit
AFX_SET_OBJ <afx_obj> <nr> ----
(Siehe zu oberen beiden Befehlen auch Abschnitt 3.a.5, letztes Programmbeispiel.)
Dies ist zwingend notwendig für Objektzeiger, die im Moment nicht benötigt werden, denn:
In monzoom® hängen Objekte in vielfacher Hinsicht zusammen. Wenn ein Objekt gelöscht wird, kann das Auswirkungen auf viele andere Programmteile haben. Deswegen werden diese Programmteile immer informiert, wenn ein Objekt gelöscht wird und können entsprechend darauf reagieren.
Beispielsweise wird der Sequenzmanager informiert, wenn ein Objekt gelöscht wird. Hatte jenes eine Sequenz, so löscht der Manager dies.
Und so werden auch alle AnimFX-Objekte informiert, wenn ein Objekt gelöscht wird. Dabei werden für jedes AnimFX-Objekt geprüft, ob das gelöschte Objekt in einer seiner Objektzeigervariablen gelegen hat. Falls ja, wird das AnimFX-Objekt auch gelöscht. Beispielweise macht der Rüttel-Effekt keinen Sinn mehr, wenn das zu rüttelnde Objekt gelöscht wird.
Es ist daher also ganz wichtig, Objektzeigervariablen, die im Moment nicht benötigt werden, mit
AFX_SET_OBJ <afx_obj> <nr> ----
zu löschen.
Desweiteren ist es auch sehr wichtig, Objekte, die das Skript selbst löscht, zuvor aus seiner Objektzeigervariable zu entfernen.
Hierfür ein kleines Beispiel: Beim Explode-Effekt soll eine Dreiecksobjekt in seine Dreiecke zerhackstückt werden, die dann auseinanderfliegen. Der DREI_EXPLODE-Befehl verdoppelt das Dreiecksobjekt und zerhackt dann die Kopie.
Wir brauchen für den Effekt also mindestens 2 Objekzeigervariablen. Eine für das Original-Objekt und eines für die Kopie. Warum? Weil die Kopie nach der Bildberechnung wieder gelöscht werden muß, und dafür müssen wir es uns merken.
Beispiel:
Bei INIT:
; reservieren von 2 Objektzeigern
AFX_ALLOK_INTERN_VARS <afx> 0 0 2
AFX_SET_OBJ <afx> 0 <original_drei>
; zweite Variable leeren
AFX_SET_OBJ <afx> 1 ----
Bei PRERENDER:
; Original lesen, DREI_explode aufrufen, die Kopie merken
AFX_GET_OBJ <afx> 0
GET_RESULT orig
DREI_EXPLODE orig fak1 fak2 wink1 wink2
GET_RESULT double
AFX_SET_OBJ <afx> 1 double
.
.
.
Bei AFTERRENDER:
; die Kopie lesen, Variable löschen(!), dann Objekt löschen
AFX_GET_OBJ <afx> 1
GET_RESULT double
AFX_SET_OBJ <afx> 1 ----
OBJ_DEL double
; hätten wir das AFX_SET_OBJ <afx> 1 ---- weggelassen, so wäre
; das AnimFX-Objekt mit dem OBJ_DEL-Befehl gleichzeitig gelöscht worden
Für FINISH gilt das gleiche wie für AFTERRENDER, falls es noch vom Skript erzeugte Objekte zu löschen gilt: Erst die Variable mit dem Objekt-Pointer löschen, danach das vom Skript erzeugte Objekt löschen. Andernfalls wird das AnimFX-Skript anschließend selbst gelöscht, statt z.B. nur AnimFX-Objekte.
Als interne Variablen stehen neben den Objektvariablen auch Real- und Interger-Werte zur Verfügung. Dadurch kann man z.B. Werte zwischenspeichern, die von Zufallswerten abhaengen und deshalb nicht berechet werden koennen.
Erst wenn das Skript komplett beendet wird, z.B. weil die Animation fertigberechnet wurde, verfallen schließlich die internen Variablen.
© 1997 Oberland Computer