D7WS HOMEPAGE WORKSHOP NEUE XTRAS GALERIE WORKSHOP Automatic Translation LESERSERVICE BUCH NEWS

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





Directorworkshop.de ist © Joachim Gola & Gerd Gillmaier 1998-2002. Alle Rechte vorbehalten.