对象不在显示列表访问根或者在displaylist上添加的任何对象?

时间:2011-05-03 20:50:20

标签: actionscript-3 list

假设在文档类

public class Test extends MovieClip
{
    public function Test()
    {
        var object1:ClassA = new ClassA();
        //addChild(object1);
        object1.accessRoot();
    }
}

public class A extends MovieClip
{
    public function accessRoot()
    {
        var mc : MovieClip = root as MovieClip;
        mc.box.visible    =  false;
    }
}

现在盒子放在舞台上。但是当A类被添加到Test Class时,它可以工作,当A类的对象没有被添加到Test构造函数中时,root变得无法访问。是否存在不在display-list上的对象可以访问root或display-list对象的方法?

2 个答案:

答案 0 :(得分:3)

我不建议您的课程使用root或stage,这样可以更好地分派事件并进行适当的封装。

Hacky方式:

public class A extends MovieClip
{
    private var _root:MovieClip;        

    public function A(root:MovieClip)
    {
        _root = root;
    }

    public function accessRoot()
    {
        _root.box.visible = false;
    }
}

正确的方法:

public class A extends MovieClip
{

    public static const ACCESS_ROOT:String = "access_root";

    public function accessRoot()
    {
        dispatchEvent(new Event(ACCESS_ROOT));
    }
}

// in your document class

var myA:A = new A();
myA.addEventListener(A.ACCESS_ROOT, handleAccessRoot);

public function handleAccessRoot(e:Event):void{
    box.visible = false;
}

答案 1 :(得分:0)

我通常创建一种基类,它包含对文档类的引用 - 或“main”类。我在这里创建的任何东西都需要引用Main中定义的任何内容,这将扩展Element。例如:

Main类(或文档类):

public class Main extends MovieClip
{
    /**
     * Constructor
     */
    public function Main()
    {
        var obj:MyElement = new MyElement();
        obj.main = this;
        // stage will be outputted
    }
}

元素 - 存储对主类的引用。 它还包含一个init()函数,我通常通过覆盖它来代替构造函数。

public class Element extends MovieClip
{
    private var _main:Test;

    public function set main(m:Main):void
    {
        _main = m;
        init();
    }

    /**
     * Called when _main is defined
     */
    protected function init():void
    {
        // override me
    }

    public function get main():Main{ return _main; }
}

以下是如何使用Element作为类的基类:

public class ClassA extends Element
{
    /**
     * Override init rather than using a constructor
     */
    override protected function init():void
    {
        trace(main.stage);
    }
}

唯一需要注意的是,您必须在创建对象时设置_main属性。 (如Main的第9行所示)。