Flash Control (01/2000, Dir 7.02)

In diesem Bereich befinden sich Artikel und Tutorials zum Thema Director.

Moderatoren: Bär, Admin

Antworten
Admin
Site Admin
Beiträge: 41344
Registriert: 07.02.2006, 2006 16:09
Wohnort: München
Kontaktdaten:

Flash Control (01/2000, Dir 7.02)

Beitrag von Admin » 11.02.2006, 2006 16:06

Flash Control

Die Möglichkeit Flash Filme in Director zu importieren, ist ein häufig vernachlässigtes Feature. Dabei sind die Steuerungsmöglichkeiten und Kontrollmechanismen eines Flash Films durch Lingo sehr umfangreich und hilfreich. Ein Flash Film kann Teile einer Funktionalität beinhalten und diese isoliert in einem einzigen Darsteller speichern. Die einzelnen Frames und die Einstellungen des Flash Files können sowohl beim Import, als auch während der Laufzeit jederzeit dynamisch verändert werden.

Der Import Dialog bietet schon beim Importieren einige Optionen zur Einstellung des Darstellers, z.B. ob der Flash Film in einer Schleifer läuft (Loop), oder ob der Sound übernommen wird, die totale Kontrolle wird aber erst durch Lingo möglich.

Nehmen wir ein Beispiel in dem ein Flash Film mit 15 Frames importiert werden soll. Dieser Flash Film ist beispielsweise eine Animation einer Figur die über 15 verschiedene Frames / Bilder tanzt und komplett in Flash animiert wurde. Um die Animation nicht auf die Dauer zu langweilig erscheinen zu lassen, sollen die einzelnen Tanzschritte der Figur variiert werden, d.h. idealerweise sollen nicht immer Frame 1-15 ablaufen, sondern vielleicht 1-15, dann 15-10 und schließlich 1-7. Dafür den Flash Animationskünstler zu bitten, die gesamte Animation in Flash zu erstellen und damit eine weitaus größere Datei zu erstellen, wäre ziemlich aufwendig. Besonders, weil es sein kann, dass wir in Director nachher noch etwas ändern müssen weil es vielleicht besser aussieht erst bei Frame 3 anzufangen und dann erst beim zweiten Durchlauf bei Frame 1 zu beginnnen.


Die Steuerung

Zu diesem Zwecke lässt sich sehr einfach ein Behavior erstellen, welches eine solche Steuerung der Animation, sprich der Reihenfolge der Frames im Flash Film dynamisch steuert.

Welche Eigenschaften der Flash Darsteller besitzt lässt sich jederzeit mit der Funktion

Code: Alles auswählen

member(x).showProps() 
abfragen.

Wichtig für diesen Fall sind aber lediglich zwei dieser Eigenschaften des Flash Sprite bzw. Darstellers:

Code: Alles auswählen

member(x).frameCount 
sprite(x).frame 
Das folgende Behavior soll ermöglichen eine individuell angegebene Reihenfolge von Frames im Flash Film abspielen zu können. Dazu muss lediglich die Gesamtzahl der Frames im importierten Flash Darsteller abgefragt werden und eine Liste mit den gewünschten Frames erstellt werden, die anschließend bei jedem Frame (Director Frame!) abgefragt wird. Zusätzlich wird die Option hinzugefügt diese Animation ein- oder mehrmals durchlaufen zu lassen und ein zusätzliches Property "pDoAfterAnimation" definiert um festzulegen, was nach der Animation geschehen soll:


Das Behavior

Code: Alles auswählen

property pSpriteNum, pMem
property pAnimationFrames, pAnimationFramesCount
property pStartFrame, pLastFrame, pCurPos
property pAnimationRepeats
property pDoAfterAnimation

on beginSprite (me)
   pSpriteNum = me.spritenum
   pMem = sprite(pSpriteNum).member
   pLastFrame = pMem.frameCount
   me.init()
end beginSprite

on init (me)
   -- turn into a list
   pAnimationFrames = value(pAnimationFrames)
   -- check if animation frames needed
   pAnimationFramesCount = pAnimationFrames.count
   if pAnimationFramesCount <= 1 then 
     -- no custom animation
     pAnimationFrames = FALSE    else
     -- custom animation
     pCurPos = 0
     -- prepare sprite
     sprite(pSpriteNum).frame = pStartFrame
   end if
end init

on exitFrame (me)
   if NOT(pPaused) then
     if NOT(pAnimationFrames = FALSE) then
       if pCurPos = pAnimationFramesCount then 
         -- animation over
         me.checkLoop()
       else
         -- show next frame in animation
         me.showAnimation()
       end if
     end if
   end if
end exitFrame

on showAnimation (me)
   -- show the next frame
   pCurPos = pCurPos + 1
   nextFrame = pAnimationFrames[pCurPos]
   -- bug with last frame
   if nextFrame < pLastFrame then
    sprite(pSpriteNum).frame = nextFrame
  end if
end showAnimation

on checkLoop (me)
   case pAnimationRepeats of
     1: 
       -- animation over
       me.doSomething()
     otherwise
       pAnimationRepeats = pAnimationRepeats - 1
       pCurPos = 0
       me.showAnimation()
   end case
end checkLoop

on doSomething (me)
   -- do whatever
   do pDoAfterAnimation
end doSomething

on getPropertyDescriptionList

   mySprite = the currentspritenum
   if mySprite > 0 then
     if sprite(mySprite).member.type = #flash then
       myFrameCount = "[" & sprite(mySprite).member.frameCount & "]"
     end if
   end if

   p_list = [

   #pStartFrame:[
   #comment: "Start animation at frame:",
   #format: #integer,
   #default:1],
   #pAnimationFrames:[
   #comment: "Animation frames (list):",
   #format: #string,
   #default:myFrameCount],
   #pAnimationRepeats:[
   #comment: "Repeat count (-1 = infinite):",
   #format: #integer,
   #default:1],
   #pDoAfterAnimation:[
   #comment:"Do after animation:",
   #format:#string,
   #default:""]]

   return p_list

end

Fazit

Dieses Behavior könnte nun noch vielfältig erweitert werden, um die Steuerung der Animation mit vielen Feinheiten zu versehen, oder Eigenschaften wie die Skalierung, das Tempo etc. kontrollieren zu können.

Die Stärken von Flash lassen sich so ideal in einem Director Projekt nutzen, ohne Animationen aufwendig im Drehbuch erstelle, oder eine Flash Animation noch einmal in Flash bearbeiten zu müssen.

Ein kleiner Tipp noch in diesem Zusammenhang, das Flash Asset Xtra kann zu Performance Problemen führen bei starkem Einsatz von Flash Darstellern. Informationen und Workarounds dazu gibt es von Macromedia in einer Flash Technote.


Autor: Martin Kloss

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast