views:

478

answers:

4

For example I have a hierarchy of movie clips. mc1 is a child of mc, and mc2 is a child of mc1. Turns out that when I set

    mc1.visible = false;

mc2.visible stays true.

Is that supposed to happen? Is there a shortcut for testing visibility of mc2?


Code to play with:

var mc = new Sprite();

mc.graphics.beginFill(0xFF0000);
mc.graphics.moveTo(50,50);
mc.graphics.lineTo(100,50);
mc.graphics.lineTo(100,100);
mc.graphics.lineTo(50,100);
mc.graphics.endFill();

var mc1 = new Sprite();
mc1.graphics.beginFill(0x00ff00);
mc1.graphics.moveTo(150,150);
mc1.graphics.lineTo(200,150);
mc1.graphics.lineTo(200,200);
mc1.graphics.lineTo(150,200);
mc1.graphics.endFill();
mc.addChild(mc1);

var mc2= new Sprite();
mc2.graphics.beginFill(0x0000ff);
mc2.graphics.moveTo(250,150);
mc2.graphics.lineTo(200,150);
mc2.graphics.lineTo(200,200);
mc2.graphics.lineTo(250,200);
mc2.graphics.endFill();
mc1.addChild(mc2);

stage.addChild(mc);

mc1.visible = false;

function myOnEnterFrame(e){
    trace(mc2.hitTestPoint(mouseX, mouseY));
}

stage.addEventListener(Event.ENTER_FRAME, myOnEnterFrame);

Results: mc2.visible will still be true. hitTest will still fire for mc2.

Is there any other way of testing mc2 presence on stage except iterating over parents?

+1  A: 

Yes a child of a parent that is set visible=false will be hidden as well. It follows the simple hierarchy.

And you can always test for a visible status by

if(uiObject.visible) ...

Alternatively you can always set the alpha = 0, but in terms of memory management it's best to remove the object off the stage if you're dealing with a lot of objects.

More info in this article

keyle
Thanks for the article but it's not really what I need. I've changed the question.
clorz
+1  A: 

Nope that is not supposed to happen. If you hide a parent MovieClip then the child will always be hidden as well. My guess is that either mc2 is not a child of mc1 or your refering to another clip somewhere else that is also called mc1.

Allan
A: 

Yes, that is supposed to happen. It's the hierarchy that is playing its role in this case. You set visible to false for mc1 which makes mc1 invisible and as mc2 is child of mc1, so it will also disappear. (in other words mc2 is visible or invisible inside mc1). So if visible is reset to true for mc1 then mc2 will show up too depending on its visible property.

bhups
+4  A: 

If a parent's visible property is set to false, none of its children will be visible in the stage. But that doesn't mean that children's visible properties would be automatically set to false - they will continue to hold their original values.

In short, a DisplayObject with visible property true need not be visible on the stage - it depends on its parents' visible value too. But if an object's visible is set to false, it will not be visible no matter what.

Compile the following code and click on the text field to understand it better. The textfield will become invisible (as it's parent's visible is set to false), but its own visible property continues to be true

private var sprite:Sprite;
private var tf:TextField;
public function init():void
{
    sprite = new Sprite();
    addChild(sprite);
    tf = new TextField();
    tf.text = "sometext";
    sprite.addChild(tf);
    sprite.addEventListener(MouseEvent.CLICK, onClick)
}
private function onClick(e:MouseEvent):void
{
    sprite.visible = false;
    trace(tf.visible);//traces true - but tf is not displayed.
}


Update to answer clorz' question on how to check if an object is visible or not:

function isVisible(t:DisplayObject):Boolean
{
    if(t.stage == null)
        return false;
    var p:DisplayObjectContainer = t.parent;
    while(!(p is Stage))
    {
        if(!p.visible)
           return false;
        p = p.parent;
    }
    return true;
}
Amarghosh
this is correct. I misread the question thinking that the MovieClip was still showing and not the actual value of the property.
Allan
How can I test if the object is visible on scene then?
clorz
You are gonna have to iterate through its parent's all the way upto stage and check visible property - if at least one of them is false, it's not visible.
Amarghosh
OK, do you know if hitTestPoint takes parent visibility into account? So, if parent visible is set to false, will hitTestPoint for a child still evaluate to true?
clorz
I believe `hitTestPoint` would take visibility into account; after all, how can an object hit an invisible object - or can it? Docs say that setting visible to false make it inactive (no mouse events etc), but doesn't say anything about hit tests. Please do a test and post the result if you can.
Amarghosh
I've added the code to the question. It still fires =(
clorz
So apparently hitTestPoint checks only if there is an overlap - you might wanna consider combining the `isVisible` method (that I added to my answer) with htiTestPoint
Amarghosh