Erzeugte Objekte durch Klick mit gedrückter Strg-Taste oder durch Doppelklick löschen
Für das Löschen von auf der Bühnen liegenden Sprite- oder Movieclipinstanzen gibt es wieder wie im letzten Kapitel zwei Möglichkeiten: Entweder man platziert das Skript in der Timeline des Movieclips (für Sprites in der Klassendefinition) oder in der Maintimeline.
Grundsätzlich wird eine Movieclipinstanz gelöscht, wenn diese aus der Displayliste entfernt wird und keine weiteren Verweise auf die Instanz existieren. Erst wenn die Instanz nicht mehr z.B. über eine Variable erreichbar ist, eliminiert die Garbagecollection des Flash-Player die Instanz automatisch aus dem Speicher.
Wichtig:
Das Entfernen aus der Displayliste bedeutet noch nicht zwingend, dass die Instanz entgültig gelöscht ist. Sie ist nur nicht mehr sichtbar. Erst wenn sie nicht mehr erreichbar ist, wird sie gelöscht.
In unserem Beispiel werden die Sterne durch das Entfernen aus der Displayliste auch gelöscht, da keine weiteren Verweise existieren.
Durch die Methoden removeChild und removeChildAt können Objekte aus der Displayliste entfernt werden (siehe auch Displayliste).
Wenn man nun ein Objekt anklickt, so ist dieses Objekt das Zielobjekt (target) des Ereignisses. Mit nachfolgenden Schritten wird das Zielobjekt aus der Displayliste entfernt. Dabei ist e das Ereignisobjekt, das an den Eventlistener übergeben wird und e.target das angeklickte Zielobjekt.
1. Elternobjekt des Zielobjekts:
2. Vom Zielobjekt wird sein Index in der Displayliste des Elternobjekts ermittelt:e.target.parent
3. Das Elternobjekt löscht das Zielobjekt (= Kind) an der Stelle des ermittelten Index. Das Kind (Zielobjekt) gibt quasi seinen Eltern den Auftrag, es aus der Displayliste zu entfernen.e.target.parent.getChildIndex(e.target)
e.target.parent.removeChildAt(e.target.parent.getChildIndex(e.target))
Löschen durch Anklicken bei gedrückter Strg-Taste:
Das ergibt folgendes Skript für das Löschen eines Objekts aus der Displayliste durch Anlicken bei gedrückter Strg-Taste.
Das Skript kann im ersten Frame der Maintimeline oder der Movieclip-Timeline platziert werden. Im ersten Fall gilt das Skript für alle möglichen interaktiven Objekte auf der Bühne, im zweiten Fall nur für die Sterne.
this.addEventListener(MouseEvent.MOUSE_UP, loeschen);
function loeschen(e:MouseEvent):void {
if (e.ctrlKey == true) {
e.target.parent.removeChildAt(e.target.parent.getChildIndex(e.target));
}
}
Der Ausdruck e.ctrlKey liefert den Wert true, wenn zum Zeitpunkt des Mausereignisses die Strg-Taste gedrückt wurde. Nur unter dieser Bedingung wird das Objekt aus der Dispalyliste entfernt.
Zum Ausprobieren: Erst Stern erzeugen, dann mit gedrückter Strg-Taste auf den Stern klicken.
Löschen durch Doppelklick:
Damit eine InteractiveObject-Instanz auf einen Doppelklick reagieren kann, muss die Eigenschaft doubleClickEnabled auf true gesetzt werden. Standardmäßig ist der Wert false.
D.h. wir können entweder beim Erzeugen eines neuen Sterns die Eigenschaft setzen ...
this.stage.addEventListener(MouseEvent.MOUSE_DOWN,erzeugeStern);
function erzeugeStern(e:MouseEvent):void {
if (e.target == e.currentTarget) {
var stern:MovieClip = new GelberStern();
stern.doubleClickEnabled = true;
this.addChild(stern);
stern.x = e.stageX;
stern.y = e.stageY;
}
}
... oder gleich im ersten Frame des Movieclip-Skripts GelberStern
this.doubleClickEnabled = true;
....
Anschließend registriert sich das Mainmovie oder der Movieclip mit dem Eventlistener loeschen beim Mausereignis DOUBLE_CLICK.
D.h. das Skript kann wieder im ersten Frame der Maintimeline oder der Movieclip-Timeline platziert werden.
this.addEventListener(MouseEvent.DOUBLE_CLICK, loeschen);
function loeschen(e:MouseEvent):void {
e.target.parent.removeChildAt(e.target.parent.getChildIndex(e.target));
}
Der Eventlistener enthält wieder die removeChildAt-Anweisung, die oben erklärt wurde.
Zum Ausprobieren: Erst Stern erzeugen, dann auf den Stern doppelklicken.
Quellcode in der beigefügten zip-Datei:
createObjectsClickDragDelete.fla
createObjectsClickDragDelete1.fla
createObjectsClickDragDeleteDoubleClick.fla