-
AS3: Removing children of children
I have created a container movieclip called gameCanvas which I've added to the stage. I then have a large number of movieclips which have been added as children of gameCanvas. The reason I did this is because I thought that I would be able to get rid of all these children in one go by removing gameCanvas. Obviously I was wrong! gameCanvas is removed successfully, but all the child movieclips remain.
Is the only way to remove all the children of a container movieclip to loop through each one of them in a for loop?
And what happens to all those orphaned children - do they become children of their grandparent - ie. the parent of gameCanvas (in my case, the stage)?
-
Post some code. Removing a DisplayObject from the displayList should remove all its children as well, so you may not have added them to the thing you think you did.
-
Oh! That's what I thought should happen. I must have done something wrong then - here's what I did:
Code:
//create container movieclip and add to stage - this is done outside of any functions, so the variable is global
var gameCanvas:MovieClip = new MovieClip();
stage.addChild(gameCanvas);
//Then, inside a function, I add children to container like this:
gameCanvas.addChild(myMovieClip);
//and in another function, I remove container:
stage.removeChild(gameCanvas);
Anything wrong here? Ultimately, it's not a massive deal, as I can loop through all of the children removing them individually.
-
No, in theory, that's correct. One thing to be on the lookout for is if you ever add the same DisplayObject to another parent. If you do that, it'll be removed from the one it was on before and re-parented.
Here's a bit of code that proves that children are removed with parents:
Code:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
public class Main extends flash.display.Sprite
{
private var container:Sprite;
public function Main():void
{
container = new Sprite();
addChild(container);
var tf:TextField = new TextField();
tf.text = "in container";
container.addChild(tf);
tf.addEventListener(MouseEvent.CLICK, removeContainer);
}
private function removeContainer(event:MouseEvent):void {
removeChild(container);
}
}
}
-
Weird. No - the objects weren't added to any other parent. I guess there must be something odd happening somewhere else in my code, but there's too much of it to ask anyone to scour through it. Thanks for helping anyway - I'll just remove the children by looping through them which seems to work fine.
Cheers.
-
I think i have about the same problem in AS3 over here. I'm trying to assign instances of the RpButton class to _menuHolder which i use as a container. Works perfectly but i'd like to replace all the buttons for new ones when an other menu is loaded, so i thought i should just remove _menuHolder in an IF statement and then run the same function again but somehow _menuHolder in the IF statement is an null-object.... 8(
Hope you guys can help me out.... BTW it's XML-based
the code:
=================================
package
{
import flash.display.*;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import RpMenu;
import RpButton;
import flash.xml.*;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import fl.transitions.easing.*;
import fl.transitions.*;
public class RP extends MovieClip
{
private var xmlLoader:URLLoader;
public var xml:XML;
private var projectPath:*;
private var iProjectLength:Number;
private var iBtnLength:Number;
private var menuLoaded:Boolean = false;
private var main = this;
public function RP()
{
xmlLoader = new URLLoader();
xmlLoader.load(new URLRequest("content.xml"));
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
function xmlLoaded(event:Event):void
{
xml = XML(event.target.data);
}
_concept.addEventListener(MouseEvent.CLICK, onClickConcept);
_performance.addEventListener(MouseEvent.CLICK, onClickPerformance);
_shortFilm.addEventListener(MouseEvent.CLICK, onClickShortfilm);
}
// MENU MAKEN
private function maakMenu()
{
if (menuLoaded == true)
{
trace("menuLoaded is true");
trace (_menuHolder); returns nulll?????
trace (this._menuHolder); returns nulll?????
trace (root._menuHolder); returns nulll?????
}
var _menuHolder:menuHolder = new menuHolder();
_menuHolder.name = "_menuHolder";
//var menuHolder:MovieClip = new MovieClip();
var _RpButton:RpButton;
iProjectLength = projectPath.length();
var _RpButtonX = 0;
var _RpButtonY = 0;
for(var iProject:Number = 0; iProject < iProjectLength; iProject++)
{
iBtnLength = projectPath[iProject].sub.length();
var subPath:* = projectPath[iProject].sub
for(var iBtn:Number = 0; iBtn < iBtnLength; iBtn++)
{
_RpButton = new RpButton();
_RpButton.x = _RpButtonX;
_RpButton.y = _RpButtonY;
_RpButton.loadImage(subPath[iBtn].@img);
_menuHolder.addChild(_RpButton);
_RpButtonX += _RpButton.width + 10;
_RpButton.addEventListener(MouseEvent.CLICK, loadFull);
}
//var xdist:Number;
//this.addEventListener(MouseEvent.ROLL_OVER, scrollMenu);
//this.addEventListener(MouseEvent.ROLL_OUT, scrollOff);
}
stage.addChild(_menuHolder);
trace(_menuHolder.name);
// this.removeChild(_menuHolder); Function is switched of but somehow over here it works!!!!!!
menuLoaded = true;
}
private function loadFull(event:MouseEvent)
{
trace("loadFUll");
}
// BUTTONS
private function onClickConcept(event:MouseEvent)
{
projectPath = xml.concept.project;
maakMenu();
}
private function onClickPerformance(event:MouseEvent)
{
projectPath = xml.performance.project;
maakMenu();
}
private function onClickShortfilm(event:MouseEvent)
{
projectPath = xml.shortfilm.project;
maakMenu();
}
}
}
-
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|