In den allermeisten Fällen wird man etliche Tracks für ein einzelnes Objekt brauchen, die sich aneinander anschliessen. Damit man nicht jeden einzelnen Track separat programmieren muss, gibt es eine Funktion, mit welcher man eine ganze Sequenz von Tracks mit einem Funktionsaufruf erzeugen kann.
CAnim.AddTracks( aDivID, aStartFrameIx, ... )
myAnim.AddTracks( 'ball', 0, [100,50], [500,50], null, [100,50] );
entspricht der Sequenz:
myAnim.AddTrack( 'ball', 0, 1, [100,50], [500,50] ); myAnim.AddTrack( 'ball', 1, 1, [500,50], null ); myAnim.AddTrack( 'ball', 2, 1, [500,50], [100,50] );
Die beiden Beispiele oben erzeugen eine identische Animation. Der Ball wird von links nach rechts verschoben, bleibt dort eine Zeit lang stehen und wird dann wieder von rechts nach links zurück verschoben.
Tipp: null ist eine Abkürzung für vorherige Positionsangabe. Immer wenn zwei oder mehrere Positionsangaben hintereinander identisch sind, muss nur die erste voll ausgeschrieben werden, alle weiteren können mit null abgekürzt werden.
Die Funktion AddTracks() ist sehr flexibel, sodass sie AddTrack() oft vollständig ersetzen kann. AddTracks() kennt ein paar spezielle Anwendungsformen:
myAnim.AddTracks( 'ball', Startframe, [100,50] );
Erzeugt einen Track, der von Startframe bis zum Ende der Animation geht und den Ball bei [100,50] statisch stehen lässt.
myAnim.AddTracks( 'ball', 1, [100,50], 2, [500,50], 0 );
Erzeugt 2 Tracks. Der erste beginnt bei Frame 1 an der Position [100,50], geht über 2 Frames und endet also bei Frame 3 an der Position [500,50]. Der zweite Track beginnt bei Frame 3 an der letzten Position [500,50] und geht bis zum letzten Frame der Animation, wobei die Position beibehalten wird, als wenn hinter 0 noch null stehen würde.
myAnim.AddTracks( 'ball', 1, [100,50], 2, [500,50], 0, [100,50] );
Erzeugt wie oben ebenfalls zwei Tracks, wobei der zweite Track die Endposition [100,50] hat. Werte zwischen zwei Positionen geben also an, wie viele Frames ein Track überspannt, wobei der spezielle Wert 0 bedeutet, bis zum Ende der bis dahin definierten Animation. Wenn kein Frame überspannt werden soll, kann man den Wert 1 zwischen zwei Positionsangaben weglassen.
myAnim.AddTracks( 'ball', 0, [100,50], 2, null, 2, [500,50], 0 );
Erzeugt 3 Tracks: Der erste beginnt bei Frame 0 an der Startposition [100,50], überspannt 2 Frames und endet also bei Frame 2, wegen null an derselben Position. Der zweite Track beginnt bei Frame 2 an der letzten definierten Position, also [100,50], überspannt 2 Frames und endet also bei Frame 4 an der Endposition [500,50]. Der dritte Track schliesslich beginnt bei Frame 4 an der zuletzt angegebenen Position [500,50] und endet an derselben Position beim letzten Frame der Animation. Wir haben also zwei statische Frames mit einem dynamischen dazwischen erzeugt.
function BuildAnimation() { var dt = 1000; myAnim.AddFrames( [dt,dt,dt,dt,dt,dt] ); myAnim.AddTracks( 'ball', 0, [100,10], 2, null, 2, [500,10], null, [100,10] ); myAnim.AddTracks( 'sun', 0, [100,50], [300,50], [100,50], [500,50], 2, null, [100,50] ); myAnim.Load(); // initialisiert die Animation }
Auch bei der Funktion AddTracks() können sowohl die einzelnen Tracks, als auch die ganze Track-Sequenz moduliert werden, wobei in letzterem Fall die Modulations-Funktion jedem einzelnen Track der Sequenz zugewiesen wird. Zudem besteht auch hier natürlich die Möglichkeit, eine globale Modulations-Funktion dem entsprechenden Actor zuzuweisen (siehe Globale Modulation aller Pfade eines Objektes).
function Vibrate( aValue ) { return aValue + Math.sin(Math.PI*aValue*4)/10; } function BuildAnimation() { var dt = 1000; myAnim.AddFrames( [dt,dt,dt,dt,dt,dt] ); myAnim.AddTracks( 'ball', 0, Vibrate, [100,10], 2, null, 2, [500,10], null, [100,10] ); myAnim.AddTracks( 'sun', 0, [100,50], [300,50], Vibrate, [100,50], [500,50], 2, null, Vibrate, [100,50] ); myAnim.Load(); // initialisiert die Animation }
Dadurch, dass beim Ball die Funktion Vibrate() am Anfang, vor der ersten Positionsangabe gesetzt wird, gilt diese für die ganze Track-Sequenz. Bei der Sonne hingegen gilt Vibrate() nur für jene Tracks, zwischen deren Positionsangaben sie gesetzt wird. Im Beispiel immer dort, wo die Sonne von rechts nach links läuft.