Titelbild

Flash ActionScripting für Seiteneinsteiger

Index

1/ Wo packe ich meine Scripts hin?

Wo kann ich ActionsScripts hineinschreiben, welche Events stehen mir dann zur Verfügung?

2/ Eventtypen

Was für Events brauche ich, was für Optionen habe ich um die Events abzufragen?

3/ Datenhierachie

Properties sind immer relativ zum Container in dem sie sitzen.

4/ Slow

Sehr langsame Flash-Befehle und Workarounds.

5/ Optimierungen

Möglichkeiten um die Performance von Vektordarsteller zu Optimieren.

6/ Bugs

Von mir bemerkte ActionScript-Bugs.

Flash5 ActionScripting für Seiteneinsteiger

Flash ist von Version zu Version immer mächtiger geworden. Das Bedienungskonzept steht allerdings auf wackeligen Fundament da sich eigentlich seit Flash 2 kaum etwas grundlegendes getan hat. Vieles war inzwischen an Funktionalität hinzugekommen ist, wirkt provisorisch angeflanscht.

Wer eher von der gestalterischen Seite kommt, wird Probleme haben die Eigenschaften der Objekte in der Zeitleiste zu erkennen. Er muß sich stattdessen duch ein Wust von Paletten kämpfen. Da ist das Bedienungskonzept von Adobe Livemotion, Adobe After Effects oder auch Apple FinalCut schon zugänglicher und übersichtlicher.

Ein ActionScript-Programmierer wird ähnlich geartete Probleme haben. Zwar wurden erstmals mit Flash 5 ActionScript durch Standardisierung und Tools auf einem Level gehoben der auch dem Kaufpreis entspricht. Aber es hapert doch stark am Workflow und Ausführung.

Es ist eigentlich ziemlich peinlich für Macromedia, das eine ganze Reihe von ActionScript-Befehlen nicht "hardgecodet" wurden, sondern nur im ungleich langsameren Flash-Bytecode. Dies betrifft die meisten String-Befehle.

Was den Workflow aus Sicht eines Programmierers angeht, so fehlt es an unterstützenden Mitteln. Das Debugging ist immer noch relativ schwer, das Suchen nach bestimmten Elementen schwer und die Strukturierung immer noch unklar. Wo soll ich eine Funktion reinpacken? In einem Frame? Einem MovieClip?? Einer MovieClip-Instanz???

Es ist bezeichnet das bis zum Erscheinen von Flash 5 es eigentlich kein vernünftiges Material für Programmierer gab, also Leute die durchaus schon mit Wissen um FOR-Schleifen und Variablen gesegnet sind, aber den Spezialfall "ActionScript" noch nicht kennen.

"Flash 4 Magic" war zwar immerhin ein Buch das mit reichlich Script-Material ausgestattet war. Leider nur mit Null Beschreibung oder Erklärung was wieso gemacht worden ist.

Immerhin, die Situation hat sich gebessert. Die mit Flash 5 gelieferten Handbücher sind hochanständig und eine Reihe von interessanten Bücher ist ungefähr ein Jahr später erschienen ("ActionScript: The Definitive Guide" von Colin Moock, die "Friends of Ed"-Bücher).

Wo packe ich meine Scripts hin?

Script-Typen

Funktionen

Allgemein zugängliche Funktionen werden in Frames abgelegt. Frame in einer Ebene markieren, Scriptfenster aufrufen. Je nachdem ob man sie in einer Szene- oder in einem MovieClip-Frame stellt, ist eine Funktion so aufrufbar:
Szene: _root.doIt();
MovieClip: myClip.doIt();

Events - MovieClip

Clip-Events können nur auf Movieclip-Instanzen angewandt werden, nicht aber bei Buttons, Grafiken oder Objekte. Right-Click auf die MovieClip-Instanz, "Actions" auswählen.
Es läßt sich nur ein Event auswählen!
Das betrifft folgende Events:
Load, EnterFrame, Unload
MouseUp, MouseDown, MouseMove
KeyUp, KeyDown, Data
Wichtig: Zwar wird die Event-Programmierung "von aussen an die Clip-Instanz angehängt". Aber der "Scope" des angehängten Scriptes ist immer die Instanz selber! Also ball._x statt _root.ball._x!

Events - Button

Buttons sind ebenfalls für bestimmte Events empfänglich. Das Handling ist das gleiche wie bei den MovieClips: Right-Click auf die Button, "Actions" auswählen.
Es lassen sich mehrere Events miteinander kombinieren.
Das betrifft folgende Events:
Press (MouseDown), Release (MouseUp), Release Outside
RollOver, RollOut
DragOver, DragOut
KeyPress (KeyDown)

Event: EnterFrame

Es gibt zwei Möglichkeiten regelmäßig Handler abzuarbeiten (vgl. mit dem EnterFrame beim Director):
1/ on EnterFrame an einer MovieClip-Instanz angehängt.
2/ Als normales Script in einem Frame, ohne Funktions-Kopf oder so. Allerdings muß man dafür sorgen das der Abspielkopf auch permanent das Frame durchläuft, also in einem weiteren Frame eine Loop bauen die einige Frames zurückspringt.
go to and play frame 1

Event: RollOver

RollOver-Ereignisse lassen sich nur durch Buttons erfassen, sei es als Script auf die Button-Instanz (um z.B. woanders ein RollOver auszulösen) oder sei es direkt über die Button-Timeline.

Event: MouseDown

Drei Möglichkeiten:
1/ on MouseDown an einer MovieClip-Instanz angehängt.
2/ on Press an einer Button-Instanz angehängt.
3/ Direkt über die Button-Timeline.
In 1/ und 2/ ist der "Scope" der Programmierung auf die Instanz des Clips oder des Buttons bezogen, nicht auf _root oder den Parent!

Datenhierachie

ActionScripting ist eine unübersichtliche Sache. Zwar steckt eine Struktur und eine Hierachie dahinter, nur das diese von außen kaum zu erkennen ist. Deswegen scheint Flash voll von Macken, Marotten und Eigenarten zu stecken und man braucht eine Weile bis sich einem die dahinterliegende Philosophie erschließt.

Neben dem Platzieren von Scripts, ist Abkapselung und Hierachie von Daten und Eigenschaften so ein weiterer, auf dem ersten Blick nicht zu erkennender Spleen.

Flash kapselt seine Daten. Und um an die Daten ranzukommen, muß man wissen in welchen "Container" diese Daten stecken und wie der Hierachistrang zu diesem Container verläuft. So macht es einen Unterschied ob man _xmouse oder _root._xmouse anspricht.

Datenhierachie

MovieClip-Properties

Die Eigenschaften innerhalb eines MovieClips sind immer relativ zum Zentrum des MovieClips. Das betrifft sowohl die Ansprache der Properties, als auch die Properties selber.
_xmouse/_ymouse sind Koodinaten relativ zum Mittelpunkt des MovieClips.
_root.xmouse/_root._ymouse sind Koordinaten der Bühne mit Koordinaten relativ zur oberen linken Ecke.

MovieClip-Properties

Properties die in einem Script sind die auf einer MovieClip-Instanz angehängt sind, sind zwar "nur" auf und nicht im MovieClip. Alle Properties dieses Scripts sind trotzdem schon relativ zur MovieClip-Instanz!

Slow

Einige ActionScript-befehle fallen in der Performance sehr negativ auf. Es sind vorzugsweise Befehle zum String-Handling: String.slice(), String.split(), String.substr(). Diese sind so langsam, das mit ActionScript-Basisbefehle ohne weiteres annähernd gleich schneller Ersatz für diese String-Funktionen gebastelt werden kann.

Optimierungen, so oder so.

Zwei Eigenschaften sind entscheidend für die Performance von Vektordarsteller: Die Anzahl der Punkte bzw. Liniensegmente, und die Füllung der Vektorfläche. Selbstredend ist unter Performance-Gesichtspunkten ein Verlauf als Füllung eine suboptimale Lösung.

Die Anzahl der Liniensegmente läßt sich durch Flash optimieren, will sagen: reduzieren.

Optimize

Es gibt ein Menüpunkt mit dessen Hilfe die Anzahl der Liniensegmente reduziert werden. Der Grad der Optimierung wird durch ein Schieberegler eingestellt: Modify -> Optimize. Auch kann man die Optimierungen in mehreren Durchgängen durchlaufen lassen, bis hin zu dem Moment wo sich nichts mehr optimieren läßt.

Smooth

Durch klicken auf den "Smooth"-Button in der Werkzeug-Palette, wird eine ausgewählte Fläche geglättet und dadurch Segmente wegoptimiert.
Nicht immer ist die Optimierung optimal. Aber hier hilft ein Kuriosum: Was mit "Smooth" wegoptimiert wird, ist anscheinend ziemlich willkürlich. Wenn einem eine Optimierung nicht gefällt: Einfach "Undo" machen, und nochmal "smoothen". Mal sehen was diesmal wegfällt.

Bugs

getVersion()

Es gibt ein Problem beim Hin- und Herschalten im Editor zwischen dem "Normal"- und dem "Expert"-Modus. Dabei werden die Klammern verschluckt. Aus der Funktion getVersion() wird damit eine, leere, Variable namens getVersion.

 

<<= Brain-Indexseite

 

Kai Logo