Starten der Bewegung durch Klick auf den Linien-MovieClip

Ergebnis der swf-Datei

Der Programmcode mit Kommentar ohne Erklärungen

Kommentare sind im nachfolgenden Code grau und die wesentlichen Veränderungen zum vorigen Arbeitsschritt rot geschrieben.

// ZEICHNEN EINER WELLENLINIE IN DER LINIENSTÄRKE 3
// NACH ANKLICKEN DER KURVE BEWEGT SICH DIESE BEI GEDRÜCKTER MAUSTASTE NACH UNTEN
/*
Zeichnen der Wellenlinie in einem eigenen neuen Movieclip welle_mc
*/
createEmptyMovieClip("welle_mc", this.getNextHighestDepth());
welle_mc._x = 0;
welle_mc._y = 0;
curve(welle_mc, baseCurve, [0, 0], Stage.width, 100, 100, 3, 0xFF0000);
/*
Nach Anklicken der Kurve bewegt sich diese bei gedrückter Maustaste in Richtung unterer Bühnenrand.
Die Geschwindigkeit hängt von der Bildrate des Mainmovies ab.
*/
welle_mc.onPress = function() {
   this.onEnterFrame = function() {
      if (this._y<Stage.height) {
         this._y += 10;
      } else {
         delete this.onEnterFrame;
         delete this.onPress;
         delete this.onReleaseOutside;
      }
   };
};
/*
Stoppen der Abwärtsbewegung beim Loslassen der Maustaste.
*/
welle_mc.onReleaseOutside = function() {
   delete this.onEnterFrame;
};
/*
Definieren der Funktionen curve(), baseCurve()
*/
function curve(mc:MovieClip, bc:Function, pt:Array, l:Number, a:Number, b:Number, lineWidth:Number,                lineColor:Number):Void {
   mc.lineStyle(lineWidth, lineColor);
   mc.moveTo(pt[0], pt[1]);
   while (l>0) {
      pt = bc(mc, pt, a, b);
      l = l-a;
   }
}
function baseCurve(mc:MovieClip, pt:Array, a:Number, b:Number):Array {
   mc.curveTo(pt[0]+a/4, pt[1]-b/2, pt[0]+a/2, pt[1]);
   mc.curveTo(pt[0]+3*a/4, pt[1]+b/2, pt[0]+a, pt[1]);
   pt[0] = pt[0]+a;
   return pt;
}

Der Programmcode mit Erklärungen

Event-Handler onPress für Klick-Ereignis auf einen MovieClip

Wenn eine swf-Datei im Shockwave-Player abgespielt wird, so wird jedesmal, wenn man mit der linken Maustaste auf einen MovieClip klickt, d.h. über dem MovieClip die linke Maustaste hinunterdrückt, das Ereignis Press ausgelöst. Wichtig ist dabei, dass bei Klicks in Leerräume des Movieclips kein Ereignis ausgelöst wird.
Man kann nun für einen Movieclip ein Funktionsliteral definieren, das bei Eintreten des Press-Ereignisses aufgerufen wird, indem dieses Funktionsliteral dem Event-Handler onPress zugewiesen wird.
In unserem Fall wird für den MovieClip welle_mc ein Event-Handler onPress definiert.

welle_mc.onPress = function() {
   ......
};

WICHTIG: Wenn nun im Code des Funktionsliterals das Schlüsselwort this verwendet wird, so bezieht sich das auf den MovieClip welle_mc, denn die Funktion wird für diesen MovieClip definiert.

Im Event-Handler onPress des MovieClips welle_mc wird nun dem MovieClip durch this.onEnterFrame = function() { ....} ein Funktionsliteral für das Bewegen des Movieclips zugewiesen.
Darin wird der Clip, solange er den unteren Rand nicht erreicht hat, bei jedem EnterFrame-Ereignis nach unten verschoben.
Falls er den unteren Rand erreicht hat, werden alle Event-Handler gelöscht und der Clip lässt sich nicht mehr bewegen.

welle_mc.onPress = function() {
   this.onEnterFrame = function() {
      if (this._y<Stage.height) {
         this._y += 10;
      } else {
         delete this.onEnterFrame;
         delete this.onPress;
         delete this.onReleaseOutside;
      }
   };
};

Event-Handler onRelease und onReleaseOutside für das Ereignis "linke Maustaste innerhalb oder außerhalb eines angeklickten MovieClips loslassen"

Wenn man einen MovieClip anklickt, d.h. über dem MovieClip die linke Maustaste hinunterdrückt, muss man diese nach einer bestimmten Zeit wieder loslassen (sonst bekommt man einen Krampf im Finger). Beim Loslassen der linken Maustaste wird wieder ein Ereignis ausgelöst.
Wenn die Maustaste über dem MovieClip losgelassen wird, wird das Ereignis Release und außerhalb des MovieClips das Ereignis ReleaseOutside ausgelöst. Für diese Ereignisse gibt es wieder die Event-Handler onRelease und onReleaseOutside.

In unserem Fall wird beim Loslassen der Maus außerhalb des Movieclips (der sich ohnehin nach dem Klick von der Maus wegbewegt) der onEnterFrame-Event-Handler des Movieclips gelöscht und somit die Bewegung gestoppt.

welle_mc.onReleaseOutside = function() {
   delete this.onEnterFrame;
};

Eine Denkaufgabe

Wenn man den linken Codeabschnitt, der oben besprochen wurde, durch den rechten ersetzt, erreicht man dasselbe Ergebnis. Warum?
_root bezeichnet dabei das Mainmovie.

welle_mc.onPress = function() {
   this.onEnterFrame = function() {
      if (this._y<Stage.height) {
         this._y += 10;
      } else {
         delete this.onEnterFrame;
         delete this.onPress;
         delete this.onReleaseOutside;
      }
   };
};
welle_mc.onReleaseOutside = function() {
   delete this.onEnterFrame;
};

welle_mc.onPress = function() {
   _root.onEnterFrame = function() {
      if (welle_mc._y<Stage.height) {
         welle_mc._y += 10;
      } else {
         delete this.onEnterFrame;
         delete this.onPress;
         delete this.onReleaseOutside;
      }
   };
};
welle_mc.onReleaseOutside = function() {
   delete _root.onEnterFrame;
};