AS3: Elemente nach Namen aus Array entfernen

hugo1981

Erfahrenes Mitglied
Hallo @ll,

ich komme seit ein Paar Stunden nicht drauf, wie ich einzelne Strings aus einem String Array löschen kann.

Wisst ihr ob und wie es geht?

Ich benutze das Array, um MC Instancen auf der Bühn, weitere MCs zuzuweisen. Dafür hat das "Container MC" ein Attribut Namens Array;
Code:
 this.appended = [];

Wenn auf der Bühne ein MC darauf abgelegt wird füge ich den Namen in die Liste:
Code:
var actClip = iconEvent.target.name+buttonMCCounter;
var dropedTarget = getChildByName(iconEvent.target.dropTarget.parent.name);
dropedTarget.assigned.push(actClip);
Daduch will ich später checken, welche MC an den Container "gebunden" sind und diese Falls der Container bewegt wird mitbewegen.:)

Jetzt will ich falls, das hinzugefügte MC wieder gelöscht wird, es natürlich auch aus dem Array löschen.

Daduch will ich später checken, welche MC an den Container "gebunden" sind und diese Falls der Container bewegt wird mitbewegen etc. :)

PS:
Wenn es dafür eine elegantere Methode gibt, nehme ich das auch gerne an. Bevor ich mich auf einem Holzweg verlaufe...


lg,
Hugo
 
Hallo,

um den String aus einem Array zu entfernen, könntest du z.B. eine Funktion wie folgende verwenden:

Code:
function removeStringFromAry(a_string: String, a_ary: Array): String {
     for (var i: int = 0; i < a_ary.length; i++) {
          if (a_ary[i] as String  == a_string) return a_ary.splice(i, 1) as String;
     }
}

Ich an deiner Stelle würde aber das mit den Strings sein lassen und direkt mit Referenzen arbeiten, die lassen sich ebenso vergleichen, man erspart sich aber das ewige getChildByName-Zeug.

Gruss
 
die frage ist mir jetzt zwar peinlich, aber wie mache ich das ganze mit Referenzen?
(was mir auf jedenfall lieber wäre).

Die Referenzen lege ich aber trozdem in einem Array ab, oder?
Und das lösch Problem besteht auch weiterhin.. Wieso kam ich nicht auf die Schleife? :)

Ich hatte sowieso ein schlechtes Gewissen, als ich die Array mit Strings, als Repräsententen füllen wollte :)

Aber danke schonmal. Die Bewertung hast Du dir verdient ;)
 
Hallo,

das mal vorweg. Bei folgendem Codeschnipsel sind die Variablen "me", "myself" und "i" Referenzen auf ein und dasselbe Sprite:
Code:
var me: Sprite = new Sprite();
var myself: Sprite = me;
var i: Sprite = i;

Wenn ich das nun richtig verstehe, gehts drum, dass du per Drag irgendwelche Clips/Sprites auf eine Fläche schmeisst und bei dieser Fläche sozusagen als "Anhängsel" registrieren willst.

Gegeben seien zwei Komponenten: Einerseits das Sprite "dragMe" und das Sprite "dropOnMe". Das Sprite "dragMe" kann man drag'n'droppen. Das Sprite "dropOnMe" verfügt über die Methoden "addSatellit", mit welcher ein Dragger registriert wird und "removeSatellit" mit welcher man einen Dragger freigeben kann. Ausserdem verfügt das Sprite "dropOnMe" über die Eigenschaft "satellites", ein Array, in dem sämtliche Satelliten gespeichert werden. Ich hab das mal in einer Klassen-Struktur geschrieben:

DragMe
Code:
package com {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	public class DragMe extends Sprite {
		
		public function DragMe() {
			addEventListener ("mouseDown", startDragging);
		}
		
		private function startDragging (a_event: MouseEvent): void {
			startDrag(true);
			removeEventListener ("mouseDown", startDragging);
			addEventListener ("mouseUp", stopDragging);
		}
		
		private function startDragging (a_event: MouseEvent): void {
			stopDrag();
			var dropOnMe: DropOnMe = dropTarget as DropOnMe;
			dropOnMe.addSatellite(this);
			
			removeEventListener ("mouseUp", startDragging);
			addEventListener ("mouseDown", startDragging);
		}
	}
	
}

DropOnMe

Code:
package com {
	import flash.display.Sprite;
	
	public class DropOnMe extends Sprite{
		
		private var satellites: Array
		
		public function DropOnMe() {
			satellites = [];
		}
		
		public function addSatellite (a_dragger: Sprite): void {
			satellites.push(a_dragger);
		}
		
		public function removeSatellite (a_dragger: Sprite): Sprite {
			for (var i: int = 0; i < satellites.length; i++) {
				if (satellites[i] as Sprite == a_dragger) return satellites.splice(i, 1) as Sprite;
			}
		}
	}
}

Das mal so als Denkanstoss.

Gruss
 
super Danke Dir vielmals.
Werde ich gleich versuchen umzusetzen...

Hier meintest Du wohl: :)
private function startDragging (a_event: MouseEvent): void {
startDrag(true);
removeEventListener ("mouseDown", startDragging);
addEventListener ("mouseUp", stopDragging);
}

private function stopDragging (a_event: MouseEvent): void {
stopDrag();
var dropOnMe: DropOnMe = dropTarget as DropOnMe;
dropOnMe.addSatellite(this);

removeEventListener ("mouseUp", startDragging);
addEventListener ("mouseDown", startDragging);
}


Das ist auch eine gute Anregung meine functionen in Klassen zu organisieren. Bis jetzt habe ich im "Entwiklungsrausch" alles in die ActionEbene reingeschrieben.

Ich bin noch AS3 Anfänger.

So wie du es Vorgeschlagen hast, habe ich zwei AS Classen, die im Ordner com liegen?
Wenn ich eine Methode ansprechen will, mache ich das mit:

Code:
import com.*;

DragMe.dragMe();

Oder wie funktioniert das?

danke Dir nochmals...
 
Richtig, müsste natürlich "stopDragging" heissen, sorry! Damit du aber Methoden (Funktionen von Klassen) ansprechen kannst, musst du eine Instanz dieser Klasse erstellen. Eine Klasse ist grob zusammengefasst nur eine Blaupause eines Objekts, der Bauplan sozusagen. Im folgenden Beispiel ist die Variable "mc" eine Referenz auf eine neue Instanz der MovieClip-Klasse:
Code:
var mc: MovieClip = new MovieClip();

Dementsprechend müsstest du die DragMe-Klasse wie folgt instanzieren:
Code:
var dragger: DragMe = new DragMe();
Nun hat in meinem obigen Beispiel die Klasse DragMe keine öffentlichen Methoden, die du aufrufen kannst. Das geht aber nun ein bisschen weit, wenn ich dir das ganze OOP-Prinzip von AS3 erklären wollte, bräuchte das ewig. Arbeite dich am besten mal durch ein paar Tutorials, auch in der Flash-Hilfe sollten ein paar nützliche zu finden sein. Bei Bedarf bau ich dir das Beispiel von oben gerne in die Form eines onframe-Codes nach.

Gruss
 

Neue Beiträge

Zurück