Objekte von der Bühne löschen

Daimos00

Grünschnabel
Hi,

ich hab mich in den letzten Tagen mit Flash und AS3 beschäftigt und jetzt steh ich vor folgendem Problem:

Ich platziere zufällig auf meiner Bühne verschiedene Childs, die per Kolision mit meiner Hauptfigur von der Bühne wieder verschwinden. Soweit funktioniert das auch. Aber ich möchte außerdem, dass nach Ablauf eines Timers ein endsprechendes Outtro-Bild gezeigt wird. Problem hier: die vorher zufällig platzierten Objekte sind noch immer sichtbar. Per removeEventListener konnte ich zumindest verhindern, dass neue Objekte erzeugt werden. Jedoch weiß ich nicht, wie ich die bereits vorhandenen von der Bühne lösche. (Genauso verhält es sich mit meiner Figur, die ich nicht von der Bühne löschen kann und somit Fehlermeldungen bekomme.

Hier der Code:

Code:
import flash.utils.Timer;
import flash.events.TimerEvent;

// ::::::: Variablen ::
var beweX:int = 0;
var beweY:int = 0;
var t_rot:Timer = new Timer (3000, 50);
var t_gruen:Timer = new Timer (8000, 50);
var myTimer:Timer = new Timer(1000, countZeit);

var points:int = 0;
var countZeit: int = 60;
var zeit:int = 180;
//*********************



// ::::::::: EVENTS ::
addEventListener(Event.ENTER_FRAME, bewegen);

stage.addEventListener(KeyboardEvent.KEY_DOWN, funktionsaufruf);
stage.addEventListener(KeyboardEvent.KEY_UP, stoppen);

myTimer.addEventListener(TimerEvent.TIMER, runOnce);
myTimer.start();

t_rot.addEventListener(TimerEvent.TIMER, anzeige_rot);
t_rot.start();

t_gruen.addEventListener(TimerEvent.TIMER, anzeige_gruen);
t_gruen.start();
//*********************


// Funktion zur Steuerung der Figur
function funktionsaufruf(evt:KeyboardEvent) {
	if (evt.keyCode==Keyboard.RIGHT) {
		beweX=5;
		if (stehend_mc.currentFrame!= 2) {
			stehend_mc.gotoAndStop(2);
		}
	}
	if (evt.keyCode==Keyboard.LEFT) {
		beweX=-5;
		if (stehend_mc.currentFrame!= 3) {
			stehend_mc.gotoAndStop(3);
		}
	}
	if (evt.keyCode==Keyboard.DOWN) {
		beweY=5;
		if (stehend_mc.currentFrame!= 4) {
			stehend_mc.gotoAndStop(4);
		}
	}
	if (evt.keyCode==Keyboard.UP) {
		beweY=-5;
		if (stehend_mc.currentFrame!= 5) {
			stehend_mc.gotoAndStop(5);
		}
	}
}
// *********************


// Funktion zur Erhöhung der Punktzahl
function zaehler(zahl:int) {
	points = points + zahl;
	trace(points);
}
//*********************


// Funktion zur Bewegung der Figur in verschiedene Richtungen
function bewegen(evt:Event) {
	stehend_mc.x+=beweX;
	stehend_mc.y+=beweY;
}
//*********************


// Funktion zum Anhalten der Figur
function stoppen(e:KeyboardEvent) {
	beweX = 0;
	beweY = 0;
	stehend_mc.gotoAndStop(1);
}
//*********************


// Funktion zum Erzeugen der Objekte auf der Bühne
function anzeige_rot(evt:TimerEvent) {
	var meineIns_rot:kreis = new kreis();
	meineIns_rot.x = Math.random()*550;
	meineIns_rot.y = Math.random()*400;
	addChild(meineIns_rot);
}

function anzeige_gruen(evt:TimerEvent) {
	var meineIns_gruen:kreis_gruen = new kreis_gruen();
	meineIns_gruen.x = Math.random()*550;
	meineIns_gruen.y = Math.random()*400;
	addChild(meineIns_gruen);
}
//*********************


// Funktion zur Abfrage ob die Zeit abgelaufen ist
// und dann soll der Sprung zum Endbild kommen
function runOnce(event:TimerEvent):void {
	countZeit = countZeit - 1;
	zeit = (zeit - 3);
	leben_mc.gotoAndStop(zeit);
	trace("runOnce() called @ " + getTimer() + " ms");
	if (countZeit <= 0) {
		myTimer.removeEventListener(TimerEvent.TIMER, runOnce);
		removeEventListener(Event.ENTER_FRAME, bewegen);

		stage.removeEventListener(KeyboardEvent.KEY_DOWN, funktionsaufruf);
		stage.removeEventListener(KeyboardEvent.KEY_UP, stoppen);

		t_rot.removeEventListener(TimerEvent.TIMER, anzeige_rot);
		t_gruen.removeEventListener(TimerEvent.TIMER, anzeige_gruen);

		if (points >= 0) {
			gotoAndStop(4);
		} else {
			gotoAndStop(5);
		}
	}
}
// *********************

Danke für eure Hilfe
 
Zuletzt bearbeitet:
Hallo,
poste bitte das nächste mal nicht den ganzen ellenlangen Code, sondern nur die problemrelevanten Teile.

Ich kenn mich zwar überhaupt nicht mit AS3 aus, aber removeEventListener löscht doch bestimmt nur den Link zwischen Eingabemöglichkeit und dann auszuführender Funktion, oder? Dann müsste es zu addChild auch einen Counterpart geben ... removeChild?

Google nach removeChild findet das auch so. Probiers mal aus.

http://www.tutorialized.com/view/tu...orial-in-Flash-CS3-using-Actionscript-3/28645

Gruß und frohe Weihnachten
jens
 
Hi,

erst mal sorry für den ganzen Quelltext, ich hab gedacht man kann sich das Problem besser herleiten wenn man alles kennt...

Naja, auf die Idee mit removeChild() bin ich auch schon gekommen, Problem ist, dass ich ja mehrere "Kinder" eines Objektes anlege und der Befehl removeChild löscht bei mir zwar das letzte erzeugte "Kind", aber nicht alle der bisher erzeugten.

Danke für eure Hilfe
 
Hallo,

in diesem Fall empfiehlt sich die Verwendung einer Kind-Liste, z.B. eines Arrays, in der du sämtliche instanzierte Kinder speicherst und bei Bedarf mittels einer Schlaufe wieder entfernen kannst:
Code:
var liste: Array = [];

var meinKind: Sprite = new Sprite();
liste.push(meinKind);
addChild(meinKind);

for (var i: int = 0; i < liste.length; i++) {
     removeChild(liste[i] as Sprite);
}

Gruss
 
Zurück