HowTo:
Timing lingogesteuerter Animationen
|
|
Home
Workshop-Seite
|
Auszug aus Kapitel 1 des
Director 7 Workshops: Der
repeat-Loop ist out: Überlegungen zum Timing Lingo-gesteuerter
Animationen
Für das Timing von
Lingo-gesteuerten Animationen sind drei prinzipielle Ansätze
zu unterscheiden:
- Die repeat-Schleife: keine parallele Aktion möglich,
feste Schrittgröße, ungewisse Dauer
- Koppeln der Lingo-Animation
an die Bildrate des Director-Films: feste Schrittgröße,
Dauer relativ
- Animation relativ
zu einer Gesamtdauer: feste Dauer, Schrittgröße relativ
Nehmen wir ein einfaches
Blend-Behavior als Beispiel; ein Sprite soll von transparent zu
opak geblendet werden.
Im beginsprite-Handler
wird sprite(me.spritenum).blendlevel
= 0 gesetzt. Der Ort für alle folgenden Skriptbeispiele
ist ein Sprite-Behavior.
|


 |
|
|
repeat-Schleife
Variante 1 mit repeat-Schleife
würde wie folgt aussehen (Schrittweite ist konfigurierbar):
property p_animrunning
on beginsprite me
sprite(me.spritenum).blendlevel = 0
p_animrunning = 1
end
on
exitframe me
if p_animrunning then do_animation me, 1 -- Schrittweite
1
end
on do_animation me, Schrittweite
mylevel = sprite(me.spritenum).blendlevel
repeat while mylevel < 255
mylevel = mylevel + Schrittweite
sprite(me.spritenum).blendlevel = mylevel
updatestage
end repeat
sprite(me.spritenum).blendlevel = 255
p_animrunning = 0
end
Der Nachteil dieser Lösung liegt auf der Hand: Während
des repeat-Loops sind andere Aktionen auf dem Bildschirm gestoppt,
da kein anderes Skript parallel abgearbeitet werden kann. Aktionen,
die länger als Sekundenbruchteile dauern (und die Blend-Aktion
dauert je nach Rechner mehrere Sekunden), sollten Sie so nicht animieren.
Sie haben auch keinerlei Kontrolle über das Timing, es sei
denn, Sie fügen Warteschleifen ein und verlängern die
Durchlaufzeit des repeat-Loops auf diese Weise zusätzlich.
|


 |
|
|
Koppelung an Bildrate
Variante 2 koppelt die
Animation an die Bildrate des Director-Filmes; das bietet Vorteile,
wenn andere Aktionen synchron ablaufen sollen. Die Geschwindigkeit
der Animation läßt sich hier über die Einstellung
im Tempokanal steuern, die Schrittweite wird konfiguriert.
property p_Schrittweite,
p_mylevel, p_animrunning
on beginsprite me
sprite(me.spritenum).blendlevel = 0
p_Schrittweite = 1
p_mylevel = 0
p_animrunning = 1
end
on prepareFrame me
if p_animrunning then
p_mylevel = p_mylevel + p_Schrittweite
if p_mylevel < 255 then
sprite(me.spritenum).blendlevel
= p_mylevel
else
sprite(me.spritenum).blendlevel
= 255
p_animrunning = 0
end if
end if
end
|


 |
|
|
Gesamtdauer festlegen
Die dritte Variante erlaubt
es, die Gesamtdauer der Animation zu konfigurieren; im Gegensatz
zu Variante 2 ist damit die Schrittweite variabel: Je größer
die Bildrate, desto feiner aufgelöst wird die Animation sein.
Die Dauer der Animation wird hier - unabhängig von der Rechnerleistung
- immer gleich sein. Die Variable prozent
(die von der Gesamtdauer der Animation bereits vergangene Zeit)
muß als Fließkommazahl berechnet werden:
property p_Dauer,
p_mylevel, p_animrunning, p_startTicks
on beginsprite me
sprite(me.spritenum).blendlevel = 0
p_Dauer = 3*60 -- 3 Sekunden = 180 Ticks
p_mylevel = 0
p_animrunning = 1
p_startTicks = the ticks
end
on prepareFrame me
if p_animrunning then
prozent = (the ticks ö p_startTicks) / float(p_Dauer)
if prozent < 1 then
sprite(me.spritenum).blendlevel
= 255*prozent
else
sprite(me.spritenum).blendlevel
= 255
p_animrunning = 0
end if
end if
end
|


 |
|
|
Synchronisation
Variante 2 und 3 haben
unterschiedliche Einsatzbereiche; wer sie den jeweiligen Erfordernissen
entsprechend einsetzt, kann auf den repeat-Loop getrost verzichten.
Ähnlich wie in Variante
3 würden Sie vorgehen, wenn Sie Animationen fest an andere
zeitbasierte Medien (wie Video und Sound) binden wollen: Zur Synchronisation
mit einem Video setzen Sie p_Dauer
= the duration of member(videomember) - oder einen entsprechenden
Teilabschnitt des Videos - und ersetzen Sie die prozent-Berechnung
durch
prozent
= sprite(videosprite).movieTime / p_Dauer
Für Shockwave-Audio-Darsteller
können Sie direkt den Prozentwert auslesen:
prozent = the
percentPlayed of member SWAmember
|


 |
|