DisplayObject的可见属性

clo*_*orz 4 flash actionscript-3

例如,我有一个电影剪辑的层次结构.mc1是mc的子节点,mc2是mc1的子节点.事实证明,当我设置

    mc1.visible = false;
Run Code Online (Sandbox Code Playgroud)

mc2.visible保持正确.

这应该发生吗?是否有测试mc2可见性的快捷方式?


代码:

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);
Run Code Online (Sandbox Code Playgroud)

结果:mc2.visible仍然是真的.hitTest仍会为mc2开火.

除了迭代父母之外,还有其他方法可以测试mc2在舞台上的存在吗?

Ama*_*osh 8

如果将父级的visible属性设置为false,则在该阶段中不会显示其子级.但这并不意味着儿童的可见属性会自动设置为假 - 他们将继续保持其原始值.

简而言之,舞台上看不到DisplayObject具有可见属性的true东西 - 它也取决于其父母的可见价值.但是如果对象的可见性设置为false,则无论如何都不会显示.

编译以下代码并单击文本字段以更好地理解它.文本字段将变为不可见(因为它的父级可见设置为false),但其自身的可见属性仍然存在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.
}
Run Code Online (Sandbox Code Playgroud)

更新回答关于如何检查对象是否可见的clorz问题:

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;
}
Run Code Online (Sandbox Code Playgroud)