Adobe Flash AS3: Drag&Drop von zur Laufzeit instanziierten Objekten

Rupp

Rupp

Aktives Mitglied
Thread Starter
Dabei seit
10.10.2004
Beiträge
7.557
Reaktionspunkte
606
Hallo,

für ein Projekt im Studium habe ich in der Flash Bibliothek ein AudioIcon als MovieClip erstellt. Davon werden im AS3 Code dynamisch zur Laufzeit 5 Instanzen erzeugt.
Jetzt müssen diese 5 AudioIcons an entsprechender Stelle im Programm per Drag & Drop sortiert in eine Leiste gelegt werden. Ich habe bereits mit Hilfe der Methode hitTestObject() eine Vielzahl an verschiedensten Kollisionskombinationen erstellt welche auch alle funktionieren.

Das einzige Problem ist, Flash setzt das „stopDrag“-Event des eigentlich bewegten AudioIcons (sagen wir Icon-2) komplett aus, wenn Icon-2 auf der Flash-Bühne visuell gesehen unter einem anderen (sagen wir Icon-5) liegt und ich Icon-2 dann auf der selben Zielbox platziere wo Icon-5 schon liegt. Flash denkt dann ich hätte Icon-5 nochmal auf die Box fallen lassen und triggert das jeweilige if-Statement. Das Problem ist, ich habe Icon-2 bewegt und nicht Icon-5.

Zur Veranschaulichung hab ich einen Screenshot angehängt. Dort liegt das Icon mit Clip-Nr 3 auf Box 4 und ich habe dann Clip-Nr 1 auch auf Box 4 gezogen. Dabei dann der fehlerhafte Trigger, dass ich angeblich Clip-Nr 3 nochmal auf Box 4 gelegt habe. Deutlich zu sehen die versch. Ebenen auf denen die Icons zu liegen scheinen.

84761d1284827443-as3-drag-and-bildschirmfoto-2010-09


Lässt sich dieses „Ebenen-Problem“ lösen, ohne dass ich die Grundidee über den haufen werfen muss?

Danke euch!


Bildschirmfoto 2010-09-18 um 18.28.07.png
 
Lösung gefunden: Drag & Drop nach Angabe in einem Ausschnitt eines Google-Books über die Bühne referenziert.
Link zum Buchausschnitt: Klick.

Code:
Variable „currentDraggabble:MemAudioIcon“ definieren:
Code:
private var currentDraggabble:MemAudioIcon;

MouseEvent.MOUSE_DOWN bei jedem AudioIcon registrieren (pber for-Schleife durch Array)
Code:
memAudioIcons[i].addEventListener(MouseEvent.MOUSE_DOWN, [COLOR="#ff8c00"]dragAudioIcon[/COLOR]);

dragAudioIcon-Methode:
Code:
private function [COLOR="#ff8c00"]dragAudioIcon[/COLOR](evt:MouseEvent):void {

// Das momentan bewegte Objekt auf currentDraggabble speichern und dann beginnen zu Draggen.
currentDraggable = MemAudioIcon(evt.currentTarget);
currentDraggable.startDrag(false);

// EventListener für Mausbewegung auf der Bühne registrieren.
stage.addEventListener(MouseEvent.MOUSE_MOVE, [COLOR="red"]onDragAudioIcon[/COLOR]);
}

onDragAudioIcon-Methode für die Flash-Bühne:
Code:
private function [COLOR="red"]onDragAudioIcon[/COLOR](evt:MouseEvent):void {

// EventListener fürs Loslassen auf der Bühne registrieren.
stage.addEventListener(MouseEvent.MOUSE_UP, [COLOR="green"]dropAudioIcon[/COLOR]);

}

dropAudioIcon-Methode:
Code:
private function [COLOR="green"]dropAudioIcon[/COLOR](evt:MouseEvent):void {

// EventListener wieder von der Bühne entfernen und Drag stoppen.
stage.removeEventListener(MouseEvent.MOUSE_UP, dropAudioIcon);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onDragAudioIcon);
currentDraggable.stopDrag();

// Eigener Code für Kollisionsabfrage …

}
 
Zurück
Oben Unten